JavaScript Window 对象始终可访问

JavaScript Window object always accessible?

本文关键字:访问 Window 对象 JavaScript      更新时间:2023-09-26

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

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

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

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

你觉得怎么样?

它使代码更具可移植性。

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

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

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

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

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

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

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

(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. 原因之一!雷西格就是那个人。