0
点赞
收藏
分享

微信扫一扫

Haproxy

如果你也在面试找工作,那么也一定遇到过这道for循环打印结果的题,下面我们来探讨下

var循环

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

先把答案写出来

 下面来讲一下原因:

划重点 ① var ②setTimeout()

重点1:你需要了解一下变量提升(hoisting)

然后上面的代码其实是这样的

var i = 0;

for (; i < 10; i++) {
  setTimeout(function () {
    console.log(i)
  })
}

重点2、setTimeout()

可以加入log进行跟踪验证:、

var i = 0;

for (; i < 10; i++) {
  console.log('+++++', i)

  setTimeout(function () {
    console.log(i)
  })
}

执行结果:

+++++ 0
+++++ 1
+++++ 2
+++++ 3
+++++ 4
+++++ 5
+++++ 6
+++++ 7
+++++ 8
+++++ 9
10
10
10
10
10
10
10
10
10
10

由此可见,当开始执行setTimeout()中的代码时for循环外面的变量i就已经变成了10,使用console.log(i)从作用域查找到的i值就是10,然后循环十次10。

let循环

ES6的let/const,简单来说let/const是声明块级作用域的变量

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

 下面是打印结果:

举报

相关推荐

0 条评论