[英]Why do I have to enclose a Javascript function call in an anonymous function for it to not be called immediately?
我有這個Javascript函數:
function Card(term, def, terms, curTerm) {
this.term = term;
this.def = def;
this.terms = terms;
this.curTerm = curTerm;
this.show = function() {
that = this;
var html = createCard(that.term, that.def);
$('body').append(html);
$('input[type=text]').focus();
$('.answer').on('click', function(event) {
event.preventDefault();
answer = $(this).parent().serializeArray()[0].value;
// answer correct
if (that.term === answer) {
$('.card').addClass('correct');
$('form').replaceWith('<h2>Correct! ' + that.term + '</h2>');
setTimeout(function () {that.destroy(terms, curTerm + 1);}, 1500);
// answer incorrect
} else {
$('.card').addClass('incorrect');
$('form').replaceWith('<h2>Incorrect! ' + that.term + '</h2>');
setTimeout(function () {that.destroy(terms, curTerm);}, 1500);
}
});
};
我遇到問題的那一行是setTimeout(function () {that.destroy(terms, curTerm + 1);}, 1500);
。 最初我有setTimeout(that.destroy(terms, curTerm + 1), 1500);
,但它沒有設置它只是調用that.destroy
的超時。 為什么在放入匿名函數時不立即調用它? 這與封閉有什么關系嗎? 因為看起來我不得不創建一個閉包,但我還沒有弄清楚他們是否肯定知道。
任何想法將不勝感激。
在您的第一個setTimeout()
調用中,這個:
that.destroy(terms, curTerm + 1)
是一個函數調用表達式。 對其進行評估,以構建一組參數值來調用setTimeout()
。
當您將其包裝在匿名函數中時, 不會調用該(匿名)函數,因為您不會使用函數調用運算符(帶括號的參數列表)對其進行后綴。
因此:形式的表達
something ( p1, p2, ... pn )
表示在評估參數列表中的每個參數后調用“something”引用的函數,然后在更大的表達式上下文繼續時使用該值。 它總是意味着在JavaScript中。 沒有語法可以說“這是我希望你稍后調用的函數,以及一些要傳遞的參數”。 (現在有一個函數可以做到 - 函數原型上的.bind()
- 但沒有特殊的語法 。)
這只是JavaScript語法的一部分。
function name() {}
聲明一個函數, name()
調用它。 您還可以使用語法(function (){})()
立即調用匿名函數。
另請注意,您可以傳遞函數名稱 ,否則匿名函數將適用,例如:
setTimeout(that.destroy, 1500)
當然,在這種情況下,您無法更改參數。
當JavaScript解釋器看到someFunction(param)
,它立即調用someFunction
方法並將參數param
傳遞給它。 換句話說,當你這樣做時:
setTimeout(someFunction(param), 1000);
...你正在傳遞setTimeout someFunction(param)的結果。 您可以將someFunction作為第一類成員傳遞,如下所示:
setTimeout(someFunction, 1000, param);
這樣,你就傳遞了setTimeout someFunction的定義。 請注意,在這種情況下傳遞param
在IE中不起作用。
另請參閱http://www.helephant.com/2008/08/19/functions-are-first-class-objects-in-javascript/ 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.