簡體   English   中英

JavaScript setTime()與回調VS. 具有匿名功能

[英]JavaScript setTime() with Call back VS. with anonymous function

我找到了以下兩個setTime函數的例子,雖然代碼看起來相同,但結果在兩種情況下是不同的。

示例1:結果“Hello堆棧溢出”

var a = "world";  
setTimeout(function(){alert("Hello " + a)}, 2000);  
a = "Stack Overflow";    

示例2:結果“Hello world”

function callback(a){  
    return function(){  
        alert("Hello " + a);  
    }  
}  
var a = "world";    
setTimeout(callback(a), 2000);    
a = "Stack Overflow";    

為什么在第一個例子中a的值發生了變化,而在excample2中它沒有?

在第一個例子中,函數讀取的值a直接。 在第二個示例中,函數讀取傳遞給它的工廠函數的參數的值。 即使我們稍后重新分配變量的值,也不會影響參數的值。 如果參數使用不同的名稱可能會更清楚:

function callback(x){  
    return function(){  
        alert("Hello " + x);  
    }  
}  
var a = "world";    
setTimeout(callback(a), 2000);    
a = "Stack Overflow";

如果您使用過一個物體,那么您將擁有不同的故事。 稍微修改您的示例,這些都具有相同的結果:

例1

var o = {};
o.a = "world";
setTimeout(function(){alert("Hello " + o.a)}, 2000);  
o.a = "Stack Overflow";

例2

function callback(obj){  
    return function(){  
        alert("Hello " + obj.a);  
    }  
} 
var o = {};
o.a = "world";
setTimeout(callback(o), 2000);    
o.a = "Stack Overflow";    

它在第二個示例中沒有改變,因為您實際上是在創建一個新的局部變量a作為callback函數的參數。 所以,當你改變全局的價值a它不會影響價值a該函數內部。

  • 全局變量a在字符串“世界”點
  • 全局變量a被傳遞給函數
  • 創建局部變量a並將其設置為全局變量a的值
  • global var a設置為新值
  • 函數稍后運行,並使用local var a的值

因為函數參數具有局部變量的語義,所以在這樣的事實之后你不能改變它。

在你的第二個例子中callback(a)創建一個封閉其保持的當前值a當你看到舊值指定的超時后執行如此。

你應該閱讀這個JavaScript Closure

通過調用callback函數, a的初始值被復制(通過值傳遞),返回的函數形成一個閉包,這就是它顯示初始值而不是最新值的原因。

第二個沒有按預期工作,因為你正在調用函數 ,這使它立即執行,而不是傳遞給setTimeout,它將在指定的時間后執行。

暫無
暫無

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

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