for循环与setTimeout定时问题

369 阅读1分钟

题目:for循环与setTimeout的处理

//要求:输出 1 2 3 4 5
//实际:输出 5 5 5 5 5
for (var i = 1; i <= 5; i++) {
  setTimeout(function (){
    console.log(i)
  },1000)
}

解决方法:

  • let解决(块作用域)
for (let i = 1; i <= 5; i++) {
  setTimeout(function (){
    console.log(i)
  },1000)
}

等价于:

{
  setTimeout(function (){
    console.log(1)
  },1000)
}
//此处省略部分代码
{
  setTimeout(function (){
    console.log(2)
  },1000)
}
  • 利用setTimeout的第三个参数
for (var i = 1; i <= 5; i++){
  setTimeout(function (j){
    console.log(j)
  },1000,i) //i就是setTimeout回调函数的参数j
}
  • 利用IIFE
for (var i = 1; i <= 5; i++){
  (function (j){
    setTimeout(function (){
      console.log(j)
    },1000)
  })(i)
}