js題集16
1.
var value1 = 0, value2 = 0, value3 = 0;
for ( var i = 1; i <= 3; i++) {
var i2 = i;
(function() {
var i3 = i;
setTimeout(function() {
value1 += i;
value2 += i2;
value3 += i3;
}, 1);
})();
}
setTimeout(function() {
console.log(value1, value2, value3);
}, 100);
//求結果和why
你可以認為 settimeout是在額外的一個控制器裏 不斷的push進代碼
for裏面加閉包 都知道閉包是立即執行 閉包作用域內 值都應該保持著當前執行循環的的值 比如i 應該分別為1,2,3 閉包完了就放掉 but 閉包裏有settimeout
settimeout裏的都是push到額外的控制器裏 這種情況下就是 當前輪執行完畢 釋放cpu 然後遍歷控制器 控制器push了三次settimeout的代碼 開始執行
代碼開始根據存儲時候的作用域找變量的值。
(模型參考event loop)--settimeout怎麽保持作用域的==自行研究
所以settimeout裏的 值 i是循環執行後的i的終值 4
i2 註意for到3的時候 i2=3;執行後i++;此時i=4,在判斷i<=3循環結束
所以
i2最終值:3.
value1 12
value2 9
最惡心的value3
在閉包裏做了這麽一個操作
var i3 = i;
i3把值輸出給了settimeout裏後就釋放掉了。
第一次循環執行閉包的時候
i3=1
第二次 i3=2 第三次 i3=3;
對應的對應的settimeout push代碼的時候就相當於
。。。
value3+=1;
。。。
value3+=2;
。。。
value3+=3;
js題集16