javascript - 为什么我必须将 Javascript 函数调用包含在匿名函数中,以免立即调用它?

标签 javascript jquery closures anonymous-function

我有这个 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/

相关文章:

javascript - 使用 jquery/ajax 加载外部页面 - 也加载外部页面的 jquery 脚本

javascript - 如何在 jQuery 中增加变量名中的数字

ios - Swift 在调试和 Release模式下的行为不同

PHP Closures - 获取闭包范围来源的类名

javascript - 如何获取特定行的索引以将其删除

javascript - 为什么在 ng-click 之后间隔不起作用?

javascript - 将 PHP 插入 jQuery css()

javascript - 如何在 Angular Directive(指令)中编译 new element.attr() ?

javascript - 为什么 .not() 没有任何影响?

javascript - 如何捕获私有(private)变量