1. 闭包
当函数可以记住并访问所在词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。
function foo(){
var a = 2;
function bar(){ // 能够访问foo()的内部作用域
console.log(a);
}
return bar;
}
var baz = foo(); // bar 在自己定义的词法作用域以外的地方执行,依然能访问foo()内部作用域
baz(); // 2
2.经典题解
1. 循环计数(非闭包)
var data = [];
for (var i = 0; i < 3; i++) {
data[i] = function () {
console.log(i);
};
}
data[0](); // 3
data[1](); // 3
data[2](); // 3
自己的理解:
var data = [];
var i; // 变量提升,i为全局变量
for (i = 0; i < 3; i++) {
data[i] = function () {
console.log(i);
}; // 将匿名函数赋值给变量
}
// 执行函数时,i为全局变量,此时已经循环完毕,i的值为3
data[0](); // 3
data[1](); // 3
data[2](); // 3
2. 循环计数(闭包)
var data = [];
for (var i = 0; i < 3; i++) {
data[i] = (function (i) {
return function(){
console.log(i);
}
})(i);
}
data[0](); // 0
data[1](); // 1
data[2](); // 2
自己的理解:
var data = [];
for (var i = 0; i < 3; i++) {
data[i] = (function (i) {
return function(){
console.log(i);
} // 将函数返回,可以在作用域外执行,产生闭包,记住此时的词法作用域
})(i); // 闭包,可以记住并访问所在词法作用域
}
data[0](); // 0
data[1](); // 1
data[2](); // 2