簡體   English   中英

傳遞變量VS傳遞值

[英]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會導致evaleval會導致怪異的瘋狂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.

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