10

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

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

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

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

你怎么看?

4

3 回答 3

4

它使代码更具可移植性。

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

稍作修改,使代码更清晰:

(function(root){
    var document = root.document,
        location = root.location,
        navigator = root.navigator;
})(window)
于 2012-08-15T00:24:49.220 回答
2

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

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

  2. 传递window给自执行函数可能会导致引用window执行比从全局空间使用它稍好。

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

于 2012-08-15T00:24:59.367 回答
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. 原因之一!雷西格就是那个人。
于 2012-08-15T00:45:43.530 回答