javascript案例--闭包应用

思考:以下代码在全局作用域中的执行结果是什么?

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

结果是:输出十个 10
分析:js的定时器是一个单独的线程,计时完成后将所要执行的任务添加到js引擎的任务队列中去。
而外层的for循环执行速度非常快,当js引擎从任务队列中取任务执行的时候,外层的for循环已经执行完毕,
且js没有块级作用域,因此js引擎执行console.log(i)的时候 i 已经变为10了,因此输出结果为十个10

问题:那么上面的代码如何改进,使输出 0 1 2 3 4 5 6 7 8 9 这种结果呢?
解决方案:利用闭包原理,创建匿名函数

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

对于如何理解闭包,请参阅本系列前面的章节: 闭包原理

猜你喜欢

转载自blog.csdn.net/weixin_40719943/article/details/106944384