闭包

// 定时器是异步编程:每一轮循环设置定时器,无需等定时器触发执行,继续下一轮循环(定时器触发的时候,循环已经结束了)
  for (var i = 0; i < 10; i++) {
    setTimeout(() => {
      console.log(i);
    }, 1000);
  }

// => let 存在块级作用域,每次循环都会在当前块作用域中形成一个私有变量i
// => 当定时器执行的时候,所使用的 i 就是所处块作用域中的 i
  for (let i = 0; i < 10; i++) {
    setTimeout(() => {
      console.log(i);
    }, 1000);
  }

// => 1、闭包解决
  for (var i = 0; i < 10; i++) {
    ~function (i) {
      setTimeout(() => {
        console.log(i);
      }, 1000);
    }(i);
  }

// => 2、闭包解决
  for (var i = 0; i < 10; i++) {
    setTimeout(((i) => {
      return () => {
        console.log(i);
      }
    })(i), 1000);
  }
  for (var i = 0; i < 10; i++) {
    setTimeout((i => () => console.log(i))(i), 1000);
  }

// => 3、基于 bind 的预先处理机制:在循环的时候就把每次执行函数需要输出的结果,预先传递给函数即可
  var fn = function (i) {
    console.log(i)
  }
  for (var i = 0; i < 10; i++) {
    setTimeout(fn.bind(null, i), 1000);
  }
posted @ 2020-04-02 17:43  YuTing-721  阅读(101)  评论(0编辑  收藏  举报