关于setTimeout的疑问

代码1

for (var i = 0; i < 5; i++) {
  setTimeout(function(i) {
    console.log(i);
  }, i * 1000);
}
//打印了5个undefined

代码2

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, i * 1000);
}
//打印了5个5

我的理解是两个代码应该都是打印出5个5,因为i是全局的,可是结果完全不同。
想请教一下,为什么第二个代码打印出来的是5个5,而第二个却是undefined呢?

阅读 2.7k
4 个回答

第一个setTimeout里面的方法定义了参数i,那么这个i的作用域是本函数内,如果没有传递的话,默认就是undefined。
第二个很简单了,每次setTimeout的时候,都会往异步队列里推一条语句,等for执行完了之后就会执行异步队列里的的函数了

代码一的意思是你的闭包是要传进来一个i参数,但是你的i在闭包的作用域下并没有赋值的,这个i和你外面循环的i是两个东西。
如果还不懂,你可以换个写法,把setTimeout的闭包单独写出来,就一眼看出问题了

1的问题上面已经说了,2是因为for循环先执行完毕,此时i=5,然后settimeout的时间到了,执行输出结果全是5

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

var改成let 可以打印1,2,3,4,5

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题