通过David Fowler查看this JS code,他用一个匿名的自我执行方法包装每个“类”,并在其中发送jQuery和window。我知道这是一种确保$和window实际上是你期望它们的全局jQuery和winndow变量的方法。
但这不是有点过度保护吗?你是否应该保护自己免受其他人更改$和window变量的影响 - 实际上是否有代码执行此操作,如果是这样,为什么?此外,还有其他优势来包装这样的一切吗?
答案 0 :(得分:5)
如果我没记错的话,除了使用$。
之外还有一些其他库答案 1 :(得分:3)
使用功能上下文创建本地/ 功能范围的概念就是保护您自己的代码。如果您希望您的Javascript代码在可能加载多个其他(甚至可能是未知的)脚本的环境中运行,这尤其有意义。
因此,如果其他一些Javascript代码在您自己之前加载,则为window.$
分配一些其他值(例如,它可能会加载原型框架),那么您的代码已经是如果你试图访问特定于jQuery的东西,那就搞砸了。
另一点是“ a - hole ” - 效果。有人创建了像
这样的行window.undefined = true;
...
现在,对undefined
的所有检查都会失败。但是通过显式创建这些变量/参数并使用您期望的值填充它们,您可以避免所有这些问题。
(function(win, doc, $, undef) {
}(window, window.document, jQuery));
答案 2 :(得分:2)
通常,大多数顶级JavaScript代码都应该包含在IIFE中,无论它们是否传递特定变量。这可以防止使用var
创建的变量污染全局范围。
另一个小好处是缩小:如果你缩小你的代码,通过将window
作为参数传递给{本地变量'允许缩小器重命名它。如果你gzip,这个好处就会消失,所以这不是真正的胜利。
大多数人只是为他们的IIFE选择一种模式并坚持使用它,所以在他的情况下,他决定这是他们写.js
文件的方式,他统一地这样做。拥有统一的标准本身就很有价值。
为了澄清,可以使用
以稍长的形式编写代码(function () {
var $ = jQuery;
var window = window;
// ...
}());
答案 3 :(得分:0)
匿名函数中的代码是函数作用域,因此它可以防止与全局变量冲突。
想象如果每个jQuery插件都没有包含在匿名函数中,那么就会出现全局变量地狱。
答案 4 :(得分:0)
只是保护完整性。 $可以是Prototype,所以如果其他人添加一个覆盖$的库/变量,那么发送jQuery作为参数将保存你的代码。
关于第二个参数“window”,我将其视为您要编写的模块。