【问题标题】:JavaScript Window object always accessible?JavaScript Window 对象总是可访问的?
【发布时间】:2012-08-15 00:19:51
【问题描述】:

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

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

在上面学习 sn-p 时,我想知道为什么像 window 这样的全局可访问对象作为参数传递给函数。会不会是这样:

  1. 开发人员不能 100% 确定地知道可以从本地函数范围内访问窗口吗?
  2. 这是一种很好的做法,因为您可以让其他阅读您的代码的开发人员清楚地了解您的意图。
  3. 您已经看到 John Resig 这样做了,所以它一定很适合舔手指!

你怎么看?

【问题讨论】:

标签: javascript scope window


【解决方案1】:

它使代码更具可移植性。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:
      (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. 原因之一!雷西格是男人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2014-06-17
        • 2016-06-03
        • 2016-01-31
        • 1970-01-01
        • 2013-03-08
        相关资源
        最近更新 更多