在for循環中添加定時器

想要在3s後順序獲得0,1,2,3,4的值,在for循環中添加一個定時器:閉包

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

輸出的結果是5個5,在上網查詢了緣由以後發現:異步

定時器函數是異步執行的,而for循環的執行速度很快,當執行到定時器的函數體時,for已經執行完畢(i的值已經變成了5);因此會輸出5個5。函數

想要正確的順序輸出i的值而不是5個5,就要保存i的值不會銷燬。code

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

經過閉包把變量i保存起來,3s後執行定時器函數能夠正確的獲得0,1,2,3,4。io

也能夠把定時器要執行的函數體單獨封裝閉包,而後在定時器中調用:console

for(var i = 0;i < 5;i++){
    setTimeout(fun(i),3000);
};
function fun(a){
    return function(){ 
        console.log(a);
     };
 };
相關文章
相關標籤/搜索