据我所知,这就是你对模块实现松散扩充的方法:
// file1.js:
var mod = (function(){
return { foo: 1 }
})();
// file2.js:
var mod = (function(mod){
console.log(mod); // Object { foo: 1 }
})(mod || {});
这显然有效,但我想要理解一些事情:
mod
参数不被第二个var mod
覆盖?在声明变量之前执行自执行函数吗?答案 0 :(得分:1)
在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
。