【问题标题】: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 这样的全局可访问对象作为参数传递给函数。会不会是这样:
- 开发人员不能 100% 确定地知道可以从本地函数范围内访问窗口吗?
- 这是一种很好的做法,因为您可以让其他阅读您的代码的开发人员清楚地了解您的意图。
- 您已经看到 John Resig 这样做了,所以它一定很适合舔手指!
你怎么看?
【问题讨论】:
标签:
javascript
scope
window
【解决方案1】:
它使代码更具可移植性。
您可以将代码复制并粘贴到没有定义全局窗口对象的环境(例如节点),但 API 兼容您在代码中关心的所有内容。然后你只需要修改传递给函数的参数。
稍微修改一下,让代码更清晰:
(function(root){
var document = root.document,
location = root.location,
navigator = root.navigator;
})(window)
【解决方案2】:
我知道您询问的代码有几个可能的原因:
在局部变量中为document、location 和navigator 创建快捷方式可能会稍微提高性能并减少输入。
将window 传递给自执行函数可能会导致对window 的引用比在全局空间中使用它的性能略好。
有一些 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)
- 通常,顶部名称是您希望它命名的名称,而底部则确保它应该代表什么。因此,在顶部有 $ 意味着您的所有 jQuery 代码(在本例中)都保留在 jQuery 中。将它用于窗口/窗口只是确保没有其他窗口定义将其原始意图更改为“窗口”。
- 这绝对是一种最佳实践,并且是一种在匿名函数/命名空间中允许您想要的内容的可控方式。
- 原因之一!雷西格是男人。