在IIFE中用全局替换窗口是否可以?

时间:2012-11-12 19:46:16

标签: javascript iife

通过这样做,某种程度上会出现错误或肮脏,但它似乎比使用导出或窗口更具语义性。这可以吗?

(function(global){
  var foo,bar;
  foo = 'Private Var';
  global.bar = 'Hello World';
})(window);

3 个答案:

答案 0 :(得分:2)

您只是通过执行此操作为窗口创建别名,而不是替换它。我喜欢这种风格。 “全球化”让你的意图更加清晰。

答案 1 :(得分:2)

你的模式很好。不过考虑一下:

// global code

(function () {

    var root = this;

    // use root variable to refer to the global object

}).call( this );

此模式不依赖于"window"名称,这使其可移植。 (名称"root"当然是任意的。)

答案 2 :(得分:0)

正如其他人所说,你不是替换 window,你只是为它创建一个别名。
你的模式很好,但我想提出一点建议:如果你在全局环境中运行那个IIFE,你应该将this作为global参数传递而不是窗口:

(function(global){

})(this);  

这可以帮助您的代码更加跨平台,比如你是否会创建一个在浏览器中运行但在另一个平台上运行的模块(比如nodejs或rhino),其中window对象没有存在,或者它不是你想要的全球对象。