2014-02-11 40 views
0

据我所知,你这是怎么实现松散增强到模块:模块模式增强

// 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/

回答

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

+0

修复了错字。也许这不是最好的例子,我大多对评估顺序感到好奇。谢谢! – Johan

+1

@Johan很高兴帮助;我将添加一些代码,实际上会向您显示评估顺序。 –