settimeout(function(){console.log(i)},0);

for(var i=0;i<10;++i){
setTimeout(function(){console.log(i)},0);
}
這是一個閉包,那麼這個閉包輸出的到底是什麼???

答案:輸出的是 10 ,且連續輸出10次;

setTimeout是異步執行,也即每一次for循環執行一次,settimeout都會執行一次,但是裏面的settimeout並沒有立即被執行,而是等到for循環結束,再執行;for循環了10次,就放了10次,當主線程執行完成後,才進入任務隊列裏面執行。

那麼如果我想將這個閉包輸出0,1,2,3,4,5,6,7,8,9怎麼辦?

答案:將var 改爲 let (es6定義);

因爲for循環頭部的let不僅將i綁定到for循環快中,事實上它將其重新綁定到循環體的每一次迭代中,確保上一次迭代結束的值重新被賦值。setTimeout裏面的function()屬於一個新的域,通過 var 定義的變量是無法傳入到這個函數執行域中的,通過使用 let 來聲明塊變量,這時候變量就能作用於這個塊,所以 function就能使用 i 這個變量了;這個匿名函數的參數作用域 和 for參數的作用域 不一樣,是利用了這一點來完成的。這個匿名函數的作用域有點類似類的屬性,是可以被內層方法使用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章