javascript - 学习ES6时let用于for循环时,函数里console的问题
本文介绍了javascript - 学习ES6时let用于for循环时,函数里console的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
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个状态?
之前搞错了,在外面不能输出i,以下是原来的问题
===============================
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)}
console.log(i); //10
a[6] = function(){console.log(i)}
而此时i=10,那么a[6]为啥不是10
解决方案
> console.log(i); //10
ReferenceError: 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
>
这篇关于javascript - 学习ES6时let用于for循环时,函数里console的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文