for-setTimeout循环输出每次递增

题目

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

方法

// 方法1:使用let形成块级作用域

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

// 方法2:闭包,借助闭包为每次循环形成一个单独的作用域以保存变量

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

// 方法3:settimeout 内部闭包,注意:不要将参数传入 return 的函数中,否则,这样无法形成闭包

for(var i = 0; i < 3; i++) {
  setTimeout((function(i) {
    return function () {
      console.log(i)
    }
  })(i), 1000)
}

// 方法4:bind

for(var i = 0; i < 3; i++) {
  setTimeout(function(i) {
     console.log(i)
  }.bind(null, i), 1000)
}

// 方法5:借助外层函数保存变量

function output(i) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}
for(var i = 0; i < 3; i++) {
  output(i)
}

总结

由于题目中循环(for(var i...))无法形成作用域,每次循环产生的 i 的值就无法得以保留。各种方法的本质在于利用 let,闭包等形成作用域以保留 i 的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、范型范型所解决的问题 函数、方法、类型:类,结构体,枚举,元组类型,协议参数,返回值,成员函数参数,成员属性类...
    我是小胡胡123阅读 863评论 0 1
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 495评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 1、随机数 不需要随机数种子 arc4random()%N + begin:产生begin~begin+N的随机数...
    我是小胡胡123阅读 4,231评论 0 2
  • 2016年11月8日丰盛日记 15 1.我拥有接受的心态,为了在后天调休备考注册消防工程师,因此今天晚上加班到现在...
    坚持玲丽阅读 157评论 0 0