请问一下下面的代码执行的结果为什么不一样?

迷耀
  • 1
新手上路,请多包涵

for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}

for (let i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}
的执行结果为什么不一样,他们执行的原理分别是什么?

回复
阅读 1.3k
4 个回答

其实就是作用域的问题,上面的是在同一个空间中不停的修改i值,下面的是在每个独立的空间中分别放一个i值

通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中。
-不论var声明的变量处于当前作用域的第几行,都会提升到作用域的头部。
-var 声明的变量会被提升到作用域的顶部并初始化,而let声明的变量在作用域的顶部未被初始化

let与var的区别,let声明的变量会产生一个块级作用域,在该代码块中有效,for(var i = 0)其实声明了一个全局变量,在外面也能访问到

用var声明的是全局变量,而es6出现了全新的块级作用域,而且里面用到了超时调用,异步操作,会最后执行,主要还是作用域的问题,兄弟具体可以去看下阮一峰的es6写的非常好

宣传栏