1. 程式人生 > >javascript非同步執行函式導致的變數變化問題解決思路

javascript非同步執行函式導致的變數變化問題解決思路

for(var i=0;i<3;i++)
{
     setTimeout(function(){
          console.log(i)
    },0);
}
控制檯輸出:
3
3
3

 這是因為執行方法的時候for迴圈已經執行完成每次執行的時候取得都是3 而不是1-2-3這時我們可以使用立即執行函式為每一次迴圈建立一個變數副本來供定時器呼叫解決這個問題

 for (var i = 0; i < 3; i++) {
            setTimeout(
           (function () {
               var _i = i;
               return function () {
                   console.log(_i)
               };
           })(),
          0);
        }
控制檯輸出:
1
2
3

上面的程式碼通過執行一個匿名函式來儲存執行時的i 的變數_i 並返回一個使用_i變數的輸出函式這個匿名函式會形成自己的閉包  執行時輸出函式會使用匿名函式閉包中儲存的_i 從而解決了變數i變化的問題