var testVar;
for(var i=0;i<3;i++){
testVar=function(){
console.log(i)
};
}
testVar(); // 结果为3
let testVar;
for(let i=0;i<3;i++){
testVar=function(){
console.log(i)
};
}
testVar(); // 结果为2
testVar中的闭包中保存了i的引用,而不是i当前的值,而i值在最后一次循环结束后执行了一次i++变成了3。
但是let的for循环,最后一次循环,应该也是保存了i的引用,而这个i在最后一次循环结束后也应该执行一次i++,也应该变成3。但是输出为什么是2。
由于对闭包的理解不同,而闭包不是这个问题的重点,所以我又换了个方式重新提问,如下------------------------
testVar()返回的是这个函数被调用的时候的i值,用var的for循环,最后一次循环i值是2,由于被调用的时候循环已经结束,i值要进行一次i++,所以变成了3;
而let的for循环,理论上来讲,也是这样的过程,最后也要进行i++,为什么还是2?
不,你不明白
你的代码相当于:
那么你告诉我,为什么不是3?跟闭包一点关系没有,仅仅因为
i
是全局变量,等你testVar()
,i
已经变成了3.ES6
let
的代码相当于等
i=3
的时候,根本不会执行{}
里的代码,所以当然是 2,而且这里的i,k都处于块级作用域,{}
之外根本无法访问。与var
是有完全区别的。es5 没掌握好不建议学es6,先巩固下
var
的变量提升和闭包
吧,es5 没有块级作用域在学 ES6 之前就应该知道的。