我有这个 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 中它总是意味着这一点。没有语法可以说“这是我希望您稍后调用的函数,以及要传递的一些参数”。 (现在有一个函数可以做到这一点 - 函数原型(prototype)上的 .bind()
- 但没有特殊的语法。)
关于javascript - 为什么我必须将 Javascript 函数调用包含在匿名函数中,以免立即调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369749/