var a = []; for (let i = 0; i < 10; i++) {
a[i] = function () { console.log(i);
};
}
a[6](); //6
console.log(a[6]); // function(){console.log(i)}既然循环结束后,数组a的每一项都是function(){console.log(i)},那么a[6]()输出是6是怎么实现的?难道let保存了10个状态?
1 回答

慕森王
TA贡献1777条经验 获得超3个赞
> console.log(i); //10ReferenceError: i is not defined
let
是块作用域声明,出了for循环就失效了~
a[6](); //6
for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; }
在匿名函数作用域中log(i)
引用了上层作用域的变量 i
,构成闭包
。
a[i]中保存了10个闭包,各自保留了构成闭包时变量 i
的值。
2个闭包栗子~
> var f=function(){
... let i=0;
... return function(){
..... i=i+1
..... return i
..... }}()
undefined
> f()
1
> f()
2
> f()
3
> f()
4
> f()
5
> var fn;
undefined
> for(let i=-1;i<0;i++){
... fn=function(){
..... i=i+1
..... return i
..... }
... }
[Function]
> fn()
0
> fn()
1
> fn()
2
> fn()
3
>
添加回答
举报
0/150
提交
取消