解决闭包的四种方案

645 阅读1分钟

闭包

// 案例
function close () {
  for (var index = 0; index < 10; index++) {
    setTimeout(() => {
      console.log(index)
    }, 1000)
  }
}
// 10,10,10...

// 法一: 利用setTimeout 定时器的第三个参数
function closeParams () {
  for (var index = 0; index < 10; index++) {
    setTimeout((index) => {
      console.log(index)
    }, 1000, index)
  }
}
// 0,1,2,3,4,5,6,7,8,9

// 法二 定义一个自执行函数
function closeCb (params) {
  for (var index = 0; index < 10; index++) {
    (function (index) {
      setTimeout(() => {
        console.log(index)
      }, 1000)
    })(index)
  }
}
// 0,1,2,3,4,5,6,7,8,9

// 法三 ES6语法定义一个自执行函数
function closeCbEs () {
  for (var index = 0; index < 10; index++) {
    ((index) => {
      setTimeout(() => {
        console.log(index)
      }, 1000)
    })(index)
  }
}
// 0,1,2,3,4,5,6,7,8,9

// 法四 不用var 该有局部作用域let
function closeLet () {
  for (let index = 0; index < 10; index++) {
    setTimeout(() => {
      console.log(index)
    }, 1000)
  }
}
// 0,1,2,3,4,5,6,7,8,9

close()
closeParams()
closeCb()
closeCbEs()
closeLet()