簡體   English   中英

為什么我必須在匿名函數中包含Javascript函數調用才能立即調用它?

[英]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.

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