为什么我将窗口对象传递给模块模式?

时间:2011-11-17 21:37:47

标签: javascript

这是一个自动执行匿名方法。

在全球范围内传递窗口似乎是一种好习惯。如果窗口随处可用,为什么要这样做呢?

(function (global) { 

 /* my code */ 

 global["someName"] = someObject; 

})(window);

2 个答案:

答案 0 :(得分:6)

它跳过了必须进行范围查找的代码,因为global的范围是在函数内部。


编辑 - 这是一项性能优化。 javascript中的范围仅限于函数范围。在这种情况下,global正在该范围内定义,因此当代码命中global[...]时,它会查看它的直接范围(在函数内)并立即找到global。如果没有它,那么它将不得不向上移动到闭包范围,在这种情况下是全局javascript命名空间,并搜索window的整个范围。

答案 1 :(得分:2)

浏览器的JavaScript解释器必须确定它找到的任何变量的范围,从最本地范围开始并向外工作。使用window作为参数global的函数闭包减少了进一步向上扩展范围链以查找window的需要。

window 随处可用,但在您的示例中使用global的方式更具效果。