1. 程式人生 > >js題集16

js題集16

out 一個 遍歷 做了 研究 釋放 立即執行 輸出 set

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