模块模式增强

时间:2014-02-11 20:46:15

标签: javascript

据我所知,这就是你对模块实现松散扩充的方法:

// 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覆盖?在声明变量之前执行自执行函数吗?
  3. http://jsfiddle.net/aVV9S/

1 个答案:

答案 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