for(var i=0; i<10; i++){ setTimeout(function() { console.log(i); },0)}请问输出什么?如果要输出'0123456789',要怎么改?
3 回答
开满天机
TA贡献1786条经验 获得超13个赞
最简单的方法 var 改成let 这是es6的方式
没有es6的话 还是用原始的闭包吧
for (var i = 0; i < 10; i++) {
(function(j) { setTimeout(function timer() { console.log(j); }, 0);})(i);
}
至尊宝的传说
TA贡献1789条经验 获得超10个赞
上面各位说得很全面了,推荐将 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
时,就在上一轮循环的基础上进行计算。
添加回答
举报
0/150
提交
取消