为了账号安全,请及时绑定邮箱和手机立即绑定

一道js面试题

一道js面试题

ibeautiful 2018-08-01 14:21:27
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);

}


查看完整回答
反对 回复 2018-08-05
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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


查看完整回答
反对 回复 2018-08-05
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

上面各位说得很全面了,推荐将 var 替换为 let拥抱 es6 吧

for(let i=0; i<10; i++){
  setTimeout(function() {    
      console.log(i);
  },0)
}

这里简单说明一下为什么如此替换会有效。

  1. var 命令声明的变量,在全局范围内有效。例中代码,全局只有一个变量 i。每一次循环,i 的值均会改变,而console.log(i) 里面的 i 指向的就是全局的 i,导致运行时输出的是最后一轮的 i 的值,即 10

  2. let 命令声明的变量,仅在块级作用域内有效。修改后的代码,每一次循环的 i 都是一个新的变量,所以最后输出0123456789

另外一点,如果每一轮循环的变量 i 均为重新声明,那它怎么知道上一轮循环的值?
因为记得。JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量 i 时,就在上一轮循环的基础上进行计算。


查看完整回答
反对 回复 2018-08-05
  • 3 回答
  • 0 关注
  • 907 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信