簡體   English   中英

如何將參數傳遞給使用setTimeout調用的函數?

[英]How can I pass an argument to a function called using setTimeout?

我想將參數傳遞給使用setTimeout調用的函數。 我找到了這三個選項:

A = 1;
// Method 1: closure things
setTimeout(function() { whatsA(A); }, 100);
// Method 2: third argument (same result with [A])
setTimeout(whatsA, 100, A);
// Method 3: eval
setTimeout('whatsA(' + A + ')', 100);
A = 2;
function whatsA(X) { console.log(X); }

這在Internet Explorer 9中顯示2undefined1

方法1 :顯然,我不希望在傳遞之后更改參數(當然在簡單整數的情況下)。

方法2 :如果只有Internet Explorer支持它,這將是完美的。

方法3 :這似乎是唯一的選擇。 但它看起來並不像其他人那么漂亮,傳遞的東西要被評估而不是功能。

有沒有更好的辦法?

我能想到的最好的解決方案是使用bind()

A = 1;
setTimeout(whatsA.bind(this, A), 100);

因為bind()實際上是一個函數調用,它會讀取當前的A值並返回一個函數,該值將該值綁定為參數。 如果您發現難以理解,請嘗試以下方法:

var newFun = whatsA.bind(this, 42);
newFun()

請注意, this是一種謊言 - 您也可以安全地傳遞window


第一種方法也可以接受,只需稍加改進:

A = 1;
var tmpA = A;
setTimeout(function() { whatsA(tmpA); }, 100);

你觀察到的實際上是一個特征,而不是一個bug。 您正在將閉包傳遞給引用局部變量的setTimeout() JavaScript非常聰明,可以在實際調用函數之前延遲對該變量的訪問。 由於您已修改變量,因此您會看到最新版本。


第二種方法已棄用 將無法在任何瀏覽器中工作


第三種方法很糟糕,避免將字符串傳遞給setTimeout() ,總有一種更好的解決方案。

你可以使用閉包:

setTimeout((function(A){
               return function(){
                   whatsA(A);
               }; 
            })(A), 100);

在你的三種方法中:

選項1:

setTimeout(function() { whatsA(A); }, 100);

這個適用於所有地方並且很簡單。 這是我建議的,除非在調用setTimeout函數之前變量A可能會改變。 如果您需要凍結A的值,請參閱下面的選項4。


選項2:

setTimeout(whatsA, 100, A);

這僅適用於某些瀏覽器。 不建議。


選項3:

setTimeout('whatsA(' + A + ')', 100);

永遠不建議這樣做。 將代碼構造為字符串然后再對其進行評估幾乎不是最佳解決方案。


我建議選項4

要凍結A的值,可以使用自執行函數創建閉包:

A = 1;

function(A) {
    setTimeout(function() {whatsA(A);}, 100);
}(A);

A = 2;
function whatsA(X) { console.log(X); }

暫無
暫無

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

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