[英]Module pattern augmentation
據我所知,這是對模塊實施寬松擴充的方式:
// file1.js:
var mod = (function(){
return { foo: 1 }
})();
// file2.js:
var mod = (function(mod){
console.log(mod); // Object { foo: 1 }
})(mod || {});
這顯然是可行的,但我想澄清兩件事:
mod
參數沒有被第二個var mod
覆蓋? 是否在聲明變量之前執行自執行函數? 可以肯定地說,在javascript中聲明具有相同名稱的變量永遠不會引起問題(即使在嚴格模式下)?
這取決於您在何處聲明該變量。 如果在全局范圍內,則如果在全局范圍內也定義了相同名稱的變量,則可能會在其他地方覆蓋您的變量。
為什么第二個IIFE中的mod參數沒有被第二個var mod覆蓋? 是否在聲明變量之前執行自執行函數?
求值順序是這樣的:首先對函數參數進行求值,然后對函數本身求值並調用。 只有在此之后,才將返回值分配給外部mod 。 您的第二個示例似乎也輸入錯誤; 它可能應該是:
var mod = (function(mod){
console.log(mod); // Object { foo: 1 }
})(mod || {});
函數內部的mod
僅限於該函數的作用域。 然而,意識到,一旦你調用這個函數, mod
是不再視為{ foo: 1}
但undefined
,因為你沒有返回從IIFE什么。
關於您的評論,您實際上可以在以下片段中看到執行的順序:
var foo = {
test: function() {
console.log("hello");
return 5;
}
};
var bar = (function(val) {
console.log("there")
console.log("bar is", bar);
return 5;
})(foo.test());
console.log("bar is", bar);
控制台將顯示:
hello
there
bar is undefined
bar is 5
這表明首先評估IIFE的參數,然后評估並調用IIFE本身,最后將值5
分配給bar
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.