for循環中的setTimeout()

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

打印結果:三個3閉包

緣由分析:setTimeout()是一個異步處理函數,它會等待全部的主線程任務處理完,纔開始執行本身的內部的任務,每隔1s往任務隊列中添加一個任務【閉包函數,setTimeout()中的函數,如今還沒執行】,當主線程執行完時,這時i=3,異步

纔開始執行任務隊列中的任務【閉包函數,setTimeout()中的函數開始執行,執行三次】。函數

for循環括號內的就是主線程,執行完時i是3,因此會打印出3次3;spa

若是想打印出0,1,2線程

解決方案:code

  1. 把var改成let,let是塊極做用域,每次for循環都會把對應的i綁定到添加的任務【閉包函數,setTimeout()中的函數】中,因此當主線程執行完時,也不會影響到每一個任務中i。因此能夠打印出0   1   2
  2. 把定時器放在一個自執行函數中用i當作參數
    (function(i){
          setTimeout(function(){
                console.log(i);
           },1000)
    })(i)
相關文章
相關標籤/搜索