为什么用JS中的匿名函数包装每个原型“类”对象?

时间:2012-09-14 09:05:06

标签: javascript

通过David Fowler查看this JS code,他用一个匿名的自我执行方法包装每个“类”,并在其中发送jQuery和window。我知道这是一种确保$和window实际上是你期望它们的全局jQuery和winndow变量的方法。

但这不是有点过度保护吗?你是否应该保护自己免受其他人更改$和window变量的影响 - 实际上是否有代码执行此操作,如果是这样,为什么?此外,还有其他优势来包装这样的一切吗?

5 个答案:

答案 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”,我将其视为您要编写的模块。