function Foo(){
var i=0;
return function(){
document.write(i++);
}
}
var f1=Foo(),
f2=Foo();
f1(); // 0
f1(); // 1
f2(); // 0
解析:关于闭包,它最大的用处有两个,一个是可以读取到函数内部的变量,另一个是让这些变量的值始终保存在内存中。
这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()
每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加油,但是相互之间不影响,因此结果是010;其实就是f1(),f2()
分别创建了自己的执行环境,所以它们两个是相互独立的。
if(! "a" in window){
var a = 1;
}
alert(a); // undefined
if(! “a” in window)这句代码的意思是:判断全局对象window中是否有变量a,如果没有变量a,就进入判断中将a赋值为1;
但是由于变量的声明提前,上面的代码等价于下面所写的内容:
var a;
if(!"a" in window){
a=1;
}
alert(a);
由于变量的声明提前特性,在执行这段代码之后,全局对象window中就已经存在a这个变量了,所以不能进入判断,对a进行赋值,
因此a的值为undefined。
注意:let声明变量时,变量不会存在window下面,参考链接如下所示:
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/30
1 | let array = [,1,,2,,3]; |
1 | // 例子: |
1 | parseInt('101',2) // 5 -> 1 * 2^2 + 0 * 2 + 1 * 2^0 = 4 + 0 + 1 = 5 |