[英]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
的值 a
設置為新值 a
的值 因為函數參數具有局部變量的語義,所以在這樣的事實之后你不能改變它。
在你的第二個例子中callback(a)
創建一個封閉其保持的當前值a
當你看到舊值指定的超時后執行如此。
你應該閱讀這個JavaScript Closure
通過調用callback
函數, a
的初始值被復制(通過值傳遞),返回的函數形成一個閉包,這就是它顯示初始值而不是最新值的原因。
第二個沒有按預期工作,因為你正在調用函數 ,這使它立即執行,而不是傳遞給setTimeout,它將在指定的時間后執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.