经典闭包

Posted 嘿嘿林子伟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典闭包相关的知识,希望对你有一定的参考价值。

for (var i = 0; i < 5; ++i) {
  setTimeout(function () {
    console.log(i + ‘ ‘);
  }, 100);
}

不能输出正确结果,因为循环中setTimeout接受的参数函数通过闭包访问变量i。javascript运行环境为单线程,setTimeout注册的函数需要等待线程空闲才能执行,此时for循环已经结束,i值为5.五个定时输出都是5 修改方法:将setTimeout放在函数立即调用表达式中,将i值作为参数传递给包裹函数,创建新闭包

for (var i = 0; i < 5; ++i) {
  (function (i) {
    setTimeout(function () {
      console.log(i + ‘ ‘);
    }, 100);
  }(i));
}

以上是关于经典闭包的主要内容,如果未能解决你的问题,请参考以下文章

Spark闭包与序列化

闭包-经典版

闭包经典案例留存

闭包经典案例留存

闭包经典案例留存

经典的闭包和函数分离写法