closure

前置知识:JavaScript是静态作用域

闭包:访问自由变量的函数

1
2
3
4
5
6
7
var a = 1;//既不是foo的局部变量,也不是foo函数的参数,a为自由变量

function foo() {
console.log(a);
}

foo();//1

即使上下文被销毁,它仍然存在,因为在作用域链上被引用了,是js的一个特性,目前如PHP,Java不会原生支持

面试题

常见的新手面试题,我遇到过好几次(作用域+闭包考点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var data = [];

for (var i = 0; i < 3; i++) {
data[i] = function () {
console.log(i);
};
}

data[0]();
data[1]();
data[2]();


//closure
var data = [];

for (var i = 0; i < 3; i++) {
data[i] = (function (i) {
return function(){
console.log(i);
}
})(i);
}

data[0]();//不用找global的i
data[1]();
data[2]();