簡體   English   中英

直接調用匿名函數與通過變量調用匿名函數之間的區別?

[英]Difference between calling an anonymous function directly vs calling it by variable?

我在解決這個問題時遇到了麻煩(假設我丟失了某些東西,因為直接調用匿名函數或通過變量調用匿名函數有所不同。

為什么在下面的示例0中設置變量“總計”?

var adder = function (total) {

    // the following function is returned 
    // and assigned to adder
    var inner_function = function (summand) {
        total += summand;
        alert(total);
    }

    return inner_function;

}(0);

adder(2); // returns 2
adder(3); // returns 5

但是當我以后像這樣調用此匿名函數時,不是嗎?

var adder = function (total) {

    // the following function is returned 
    // and assigned to adder
    var inner_function = function (summand) {
        total += summand;
        alert(total);
    }

    return inner_function;

} 

adder(0);
adder(2); // -> 2
adder(3); // -> 5

您有兩個功能。

在第一個示例中,您將外部匿名函數的返回值 (即內部匿名函數)分配給adder

在第二個示例中,將外部匿名函數分配給adder

由於adder的值在每種情況下都是不同的函數,因此您將得到不同的結果。

在您的第一段代碼中,當您使用'(0)'關閉函數主體時,您正在調用函數,這稱為自調用函數。 因此,在這兩個代碼示例中,您實際上都在兩次調用函數。

function(){}() :這也是函數聲明和自調用。

function (){} :這只是一個函數聲明。

第一個示例顯示了如何使用立即調用的函數表達式來創建一個捕獲傳遞的0的閉包。請注意,您實際上返回了內部函數,然后調用了內部函數而不是原始函數。

在第二個示例中,您還創建了一個閉包並返回內部函數,但未將其分配給任何內容,因此后續調用將目標外部函數作為目標並創建更多閉包。

嘗試這個:

adder = adder(0)

在這里,您可以用內部函數覆蓋原始功能

在第一個示例中,您希望加法匿名函數的結果,即內部函數+范圍(其中total = 0)。

那是因為您在末尾以(0)調用匿名函數。

您需要查看功能塊,就像它是一個命名函數一樣,因此它將是:

var adder = myfun(0);

var myfun = function(total){...}


Before statement is exacly the same as:

var adder = function(total){...}(0);

那就是你在做什么。

這很簡單:在示例中,您將兩個不同的事物分配給adder

在第一個示例中,您自動調用了匿名function (total) {...} ,因此將其返回值分配給adder ,即inner_function

在第二個示例中,您只是將匿名函數分配給adder並且從不要求其返回值,因此您不會在任何地方分配inner_function ,因此無法使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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