JavaScript Window对象始终可访问吗?

10

我们经常看到这种方法被使用:

(function (window) {
    var document = window.document,
        location = window.location,
        navigator = window.navigator;
})(window)

当学习上面的代码片段时,我想知道为什么一个像 window 这样全局可访问的对象被作为参数传递给函数。可能是因为:

  1. 开发人员无法百分之百确定在本地函数范围内可以访问 window 对象吗?
  2. 这是一种良好的实践,因为你向阅读你代码的其他开发人员明确了你的意图。
  3. 你看 John Resig 这样做,所以肯定很牛逼!

你觉得呢?


2
JavaScript/jQuery语法是如何工作的?函数(window.undefined) - Ray Toal
是的,看起来你在那个问题上是正确的。 - ChrisRich
3个回答

4

它使代码更具可移植性。

您可以将代码复制粘贴到没有定义全局窗口对象(例如node)但在您的代码中关心的所有事物上都具有API兼容性的环境中。然后,您只需要修改传递给函数的参数。

稍作修改即可使代码更清晰:

(function(root){
    var document = root.document,
        location = root.location,
        navigator = root.navigator;
})(window)

2

我知道关于你所询问的代码可能有几种可能的原因:

  1. 在本地变量中创建documentlocationnavigator的快捷方式可能会略微提高性能,并减少输入量。

  2. window传递到自执行函数中可能会导致对window的引用比从全局空间使用它要更好。

  3. 对于javascript的某些执行环境(不在浏览器中),全局对象不叫做window,因此这段代码可以更容易地适应该环境。但是,这个原因似乎有点牵强,不太可行,因为针对浏览器编写的代码很可能会使用其他浏览器功能。


0
(function ($) { }(jQuery)); // $ stands for jQuery within this function
(function (window) { }(window)); // window still equals window
(function (bananas) { }(document)); // all references to bananas => document. (silly)
  1. 通常顶部的名称是您想要命名的名称,而底部则确保其应该表示的内容。因此,在顶部使用$表示所有jQuery代码(在此示例中)仍然与jQuery相关。将其用于window/window只是确保没有其他定义的窗口更改其原始意图为“窗口”。
  2. 这绝对是一种最佳实践,也是允许您在匿名函数/命名空间中使用所需内容的受控方式。
  3. 其中一个原因!Resig就是那个人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接