[英]Passing variables VS passing values
我很想了解以下兩者之間的區別:
var the_timeout = setTimeout("alert(the_string);", 60000);
和:
var the_timeout = setTimeout("alert(" + the_string + ");",60000);
我知道第一個傳遞變量,第二個傳遞值-但這到底是什么意思,為什么重要呢? 為什么在第二個示例中傳遞值?
另外(我希望這是同一主題),為什么起作用:
var timeout=setTimeout("someFunction();", 3000)
雖然這不是:
var timeout=setTimeout(someFunction(),3000);
調用函數時, someFunction()
起作用,所以為什么在使用setTimeout()?
時必須加引號setTimeout()?
我認為您與此混淆了“按值傳遞”和“按引用傳遞”之間的區別。 在您提到的示例中,沒有區別。
然而,
var timeout=setTimeout("someFunction();", 3000)
作品和:
var timeout=setTimeout(someFunction(),3000);
並不是因為在第二種情況下, someFunction()
會運行,以便隨后可以將結果/返回值傳遞給setTimeout
。 這就是為什么將它作為字符串傳遞,以便setTimeout
可以獨立eval
它的原因。 除非,當然,除非someFunction()
本身返回setTimeout
可以用作回調的函數。
但是,正如zerkms在評論中指出的那樣,您應該傳遞回調:
var timeout = setTimeout(function() { someFunction(); }, 3000);
這還具有以下效果: setTimeout
然后可以在需要時調用回調。 一個主要的好處是您可以傳遞任何常規函數,以便可以從可能使用的編輯器中受益,而不是將所有內容打包到一個字符串中:
var myTrigger = function() {
someFunction();
};
var timeout = setTimeout(myTrigger, 3000);
60秒后,它將解析執行字符串中的代碼。
var the_string = "Hello";
setTimeout("alert(the_string);", 60000);
the_string = "Goodbye";
這意味着將執行alert(the_string)
,就好像它是常規代碼一樣。 因此它將提醒“再見”。 這是因為最終執行代碼時,因為要傳遞變量,所以將使用the_string
的更新值。
但這確實有所不同。
var the_string = "Hello";
setTimeout("alert(" + the_string + ");",60000);
the_string = "Goodbye";
現在,我們正在動態創建一個新的代碼片段。 我們正在創建的代碼片段是alert(Hello);
。 但是Hello
是一個沒有值的變量,因為您沒有正確使用引號。
但是可以說你的意思是這樣的:
var the_string = "Hello";
setTimeout("alert('" + the_string + "');",60000);
the_string = "Goodbye";
現在這將起作用,因為它生成的代碼是alert('Hello');
。 乍一看似乎做同樣的事情。 但是,因為現在生成的代碼實際上包含一個硬編碼的字符串,所以當the_string
更改時,由於它已硬編碼到摘錄中,因此更改不會將其更改為生成的代碼。
基於此,這很簡單:
setTimeout("someFunction();", 3000)
延遲后將執行字符串中的代碼。 在這種情況下,將執行someFunction()
。
但這是完全不同的:
setTimeout(someFunction(),3000);
在這種情況下, someFunction()
將立即執行 ,並將其返回值作為第一個參數傳遞給setTimeout()
函數。 因此,它根本無法實現您的期望。
大多數情況與eval
和生成的代碼有關,因為setTimeout(string,delay)
是eval
一種形式。 如果您不使用eval
,並且不將字符串傳遞給setTimeout()
,那么這都不是問題。
將字符串傳遞給setTimeout
會導致eval
, eval
會導致怪異的瘋狂bug,怪異的瘋狂bug會導致痛苦,痛苦會導致痛苦 。
相反,您可以傳遞一個函數。 每種方式都更好。
// pass an anonymous function to run some code later
var the_string = "Hello";
setTimeout(function() {
alert(the_string);
}, 60000);
the_string = "Goodbye";
// alerts "Goodbye" 60 seconds later
// pass an anonymous function to run some code
setTimeout(function() {
someFunction();
}, 3000);
// or pass a reference to a function to execute, note lack of ()
setTimeout(someFunction, 3000);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.