#### 闭包的问题
闭包是指有权访问另一个函数作用域中的变量的函数。
问题例子:
function demo() {
var a = 0;
function b(n) {
a+=n;
console.log(a);
}
return b();
}
demo(1);//输出NaN
demo(1);//输出NaN
demo(1);//输出NaN
解决例子:
function demo() {
var a = 0;
return function(n) {
a+=n;
console.log(a);
}
}
var fn = demo();
fn(1); //输出:1
fn(1); //输出:2
fn(1); //输出:3
使用for循环出现的类似闭包的问题
例子:
<button>0</button>
<button>1</button>
<button>2</button>
var btns = document.querySelectorAll("button");
for (var i = 0; i < btns.length; i++) {
btns[i]`.onclick` = function() {
console.log(i);
}
}
//输出:3 3 3
解决方法:
<button>0</button>
<button>1</button>
<button>2</button>
var btns = document.querySelectorAll("button");
for (var i = 0; i < btns.length; i++) {
(function(i) {
btns[i]`.onclick` = function() {
console.log(i);
}
})(i)
}
//输出:1,2,3
使用立即执行函数立即执行的函数会把每次循环的 i 值以参数的形式保存在函数内部。