簡體   English   中英

Javascript - 幫助理解變量行為

[英]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; ...)

即使在i0setTimeout(callback, 2000) ,在2000ms之后,這是足夠的時間來運行整個for循環, i將變為10,並且當callback時, The first test returns: 10將顯示The first test returns: 10

但是,在進行閉包的第二個示例中, callback本身仍然是function(){alert('...' + i);} ,但由於匿名函數中的參數i其父作用域,因此icallback是參數i在匿名函數中,而不是i in for(var i = 0; ...)

由於JavaScript使用call-by-value,當callback(function(i){...}(i))設置時, i將被“修復”,這使得帶有參數i的匿名函數然后立即通過值應用它ifor(var i ...) )。

GC在這里沒有任何作用。 (GC的不同行為 - 除了內存使用和時間 - 意味着GC中存在錯誤。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM