1. 程式人生 > >經典閉包

經典閉包

++i 通過 循環 javascrip 都是 () settime 定時 接受

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

經典閉包