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)
   }

對於如何理解閉包,請參閱本系列前面的章節: 閉包原理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章