簡體   English   中英

這是一個立即調用的函數表達式嗎?

[英]Is this an immediately invoked function expression?

我是一個 javascript 新手,試圖圍繞這段代碼進行思考。 我在這里得到它http://brackets.clementng.me/post/24150213014/example-of-a-javascript-closure-settimeout-inside

我仍然很難理解它。 因為它涉及一些我不熟悉的模式。

// output 0-9, seperated by 1 sec delay.
for (var i = 0; i < 10; i++) {
    setTimeout(function(x) { 
        return function() { 
            console.log(x); 
        }; 
    }(i), 1000*i);
}

這部分代碼中的 (i) 是什么意思?

function(x) { 
    return function() { 
        console.log(x); 
    }; 
}(i)

我認為這是一個立即調用的函數表達式。 但不是正確的語法是:

(function() {
  // some code
})();

這確實是一個 IIFE。 您引用的語法是 0 個參數的 IIFE; 您詢問的語法是 1 個參數的 IIFE。 它將在內部代碼中將i分配給x 相比:

var print0 = function() {
  console.log("Hello!");
};
print0();

是(孤立地)相當於

(function() {
  console.log("Hello!");
})();

因此名稱:您創建一個函數,然后立即調用它。

然而,如果你想要一個論點,什么都不會改變:

var print1 = function(name) {
  console.log("Hello, " + name);
};
print1("George");

是(孤立地)相當於

(function(name) {
  console.log("Hello, " + name);
})("George");

此處的括號確保函數定義將被視為表達式而不是語句。 還有其他方法可以確保,一個常見的方法是

!function() {
  console.log("Hello!");
}();

(但有理由更喜歡括號。)由於您將它用作setTimeout調用的參數,因此它不可能是語句,因此不需要這些技巧。 它仍然稱為“立即調用的函數表達式”,因為您仍在構造函數表達式並立即調用它。

這里使用 IIFE 的原因是“捕獲”變量i的值,而不是x的位置。 如果沒有關閉技巧,你會得到 10 次超時,所有輸出10 (當console.log解析時由x表示的位置值)。

是的,並且(i)是調用的參數列表。 看看這里的詳細解釋。 在這種情況下,分組括號是不必要的,因為它是setTimeout函數調用的參數,因此無論如何都是表達式。

術語 IIFE 不僅指這種模式的語句形式,括號是必要的

在您的立即調用函數示例中,括號是可選的。

(function() {
  // some code
})();

可以重寫為

function() {
  // some code
}();

因此,示例函數調用中的i變成了函數定義中的x

function(x) { // x = 1
    return function() { 
        console.log(x); // x = 1
    }; 
}(1)

暫無
暫無

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

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