看例子:
function loop(){ for(let i=0;i<100;i++){ setTimeout( function(){ console.log(i) },100 ) }//打印,0-99 for(var i=0;i<100;i++){ setTimeout( function(){ console.log(i) },100 ) }//打印,100次100 } loop()
首先,let声明的变量每次循环都创建一个块级作用域,并且存上i的值,这里面的let定义的i
值就是局部变量,所以每次循环改变的就是对局部变量赋值,访问也是根据作用域链规则访问局部变量i
这样就得到了最后的结果。
然而,var声明的变量i是全局变量,最后访问的都是全局变量i,而每次循环改变i的值就是改变全局变量的值,故而输出值均为100.