[英]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
表示的位置值)。
在您的立即調用函數示例中,括號是可選的。
(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.