JavaScript Window对象总是可以访问?

时间:2012-08-15 00:19:51

标签: javascript scope window

我们一直在使用这种方法:

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

在研究上面的代码片段时,我想知道为什么像window这样的全局可访问对象作为参数传递给函数。可能是那样:

  1. 开发人员不能100%确定地知道可以从本地函数范围内访问窗口吗?
  2. 这是一种很好的做法,因为您可以向阅读代码的其他开发人员明确表达您的意图。
  3. 你见过John Resig,所以一定是手指舔好了!
  4. 您怎么看?

3 个答案:

答案 0 :(得分:4)

它使代码更具可移植性。

您可以将代码复制并粘贴到未定义全局窗口对象的环境(例如节点),但与代码中关注的所有内容API兼容。然后你只需要修改传递给函数的参数。

稍微修改一下,使代码更清晰:

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

答案 1 :(得分:2)

我知道您询问的代码有几个可能的原因:

  1. 在局部变量中创建documentlocationnavigator的快捷方式可能会略微提升性能并减少输入。

  2. window传递给自执行函数可能会导致对window的引用比在全局空间中使用它稍微好一点。

  3. javascript(不是在浏览器中)有一些执行环境,其中全局对象不被称为window,因此代码可以更容易地适应它。但是,这个原因似乎有点可行,因为为浏览器编写的代码很可能仍然使用其他浏览器功能。

答案 2 :(得分: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中。将它用于窗口/窗口只是确保没有其他窗口定义将其原始意图更改为“窗口”。
  2. 这绝对是一种最佳实践,也是一种在匿名函数/命名空间中允许您想要的内容的受控方式。
  3. 其中一个原因! Resig是男人。