1、函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。
2、函数与函数所依赖的上下文环境组成闭包问题。
3、闭包指的是:能够访问另一个函数作用域的变量的函数。清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i);
};
}
上面的代码构成了闭包问题,var声明的变量没有块级作用域
解决闭包问题:
1、使用let声明变量,因为let声明的变量有块级作用域
var arr = [];
for (let i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i);
};
}
2、使用IIFE立即执行函数
for (var i = 0; i < 10; i++) {
//IIFE
arr[i] = (function (num) {
//num-->0,1,2,3...
return function () {
console.log(num);
}
})(i);
}
3、如果有循环,可以使用数组的forEach