繁体   English   中英

模块模式扩充

[英]Module pattern augmentation

据我所知,这是对模块实施宽松扩充的方式:

// file1.js:
var mod = (function(){

    return { foo: 1 }

})();

// file2.js:
var mod = (function(mod){

    console.log(mod); // Object { foo: 1 } 

})(mod || {});

这显然是可行的,但我想澄清两件事:

  1. 可以肯定地说,在javascript中声明具有相同名称的变量永远不会引起问题(即使在严格模式下)?
  2. 为什么第二个IIFE中的mod参数没有被第二个var mod覆盖? 是否在声明变量之前执行自执行函数?

http://jsfiddle.net/aVV9S/

可以肯定地说,在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM