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