[英]Javascript - Help understanding variable behaviour
請看下面的兩個例子。 在這兩個示例中,變量i
被指定為0到9.在第一個示例中,在調用超時函數時, i
已經被賦值為9.我不知道超時時i
的值組。
for(var i = 0; i < 10; i++) {
var callback = function() {
alert('The first test returns: ' + i);
};
if(i === 0) setTimeout(callback, 2000);
}
在第二個選項中,我們可以通過將其傳遞到新的上下文來保持i
的值(如果這個術語不正確,請糾正我)。
for(var i = 0; i < 10; i++) {
var callback = (function(i) {
return function() {
alert('The second test returns: ' + i);
}
})(i);
if(i === 0) setTimeout(callback, 2000);
}
第二個例子給了我期望的值, 0
- 所以就垃圾收集而言,這是如何工作的? GC會在什么時候刪除此值? 在回調函數結束時? 或者會有某種內存泄漏?
在第一個例子中, callback
是函數function(){alert('...' + i);}
,其中i
是定義callback
的范圍中的變量,即i
in for(var i = 0; ...)
。
即使在i
為0
時setTimeout(callback, 2000)
,在2000ms之后,這是足夠的時間來運行整個for
循環, i
將變為10,並且當callback
時, The first test returns: 10
將顯示The first test returns: 10
。
但是,在進行閉包的第二個示例中, callback
本身仍然是function(){alert('...' + i);}
,但由於匿名函數中的參數i
其父作用域,因此i
在callback
是參數i
在匿名函數中,而不是i
in for(var i = 0; ...)
。
由於JavaScript使用call-by-value,當callback
由(function(i){...}(i))
設置時, i
將被“修復”,這使得帶有參數i
的匿名函數然后立即通過值應用它i
( for(var i ...)
)。
GC在這里沒有任何作用。 (GC的不同行為 - 除了內存使用和時間 - 意味着GC中存在錯誤。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.