慕侠2389804
上面各位说得很全面了,推荐将 var 替换为 let,拥抱 es6 吧。for(let i=0; i<10; i++){ setTimeout(function() { console.log(i); },0)}这里简单说明一下为什么如此替换会有效。var 命令声明的变量,在全局范围内有效。例中代码,全局只有一个变量 i。每一次循环,i 的值均会改变,而 console.log(i) 里面的 i 指向的就是全局的 i,导致运行时输出的是最后一轮的 i 的值,即 10。let 命令声明的变量,仅在块级作用域内有效。修改后的代码,每一次循环的 i 都是一个新的变量,所以最后输出 0123456789。另外一点,如果每一轮循环的变量 i 均为重新声明,那它怎么知道上一轮循环的值?因为记得。JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量 i 时,就在上一轮循环的基础上进行计算。