猿问

一道js面试题

for(var i=0; i<10; i++){

  setTimeout(function() {

    console.log(i);

  },0)

}

请问输出什么?
如果要输出'0123456789',要怎么改?

ibeautiful
浏览 909回答 3
3回答

开满天机

最简单的方法 var 改成let 这是es6的方式没有es6的话 还是用原始的闭包吧&nbsp;for (var i = 0; i < 10; i++) {(function(j)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;setTimeout(function&nbsp;timer()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(j); &nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;0);})(i);}

慕的地6264312

最简单的: for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;i&nbsp;<&nbsp;10;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;console.log(i); }

至尊宝的传说

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