[英]How can I pass an argument to a function when I have called it in the href tag
[英]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中顯示2
, undefined
和1
。
方法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.