想要在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); }; };