【问题标题】:What is the purpose of the anonymous function wrapper in jQuery?jQuery 中匿名函数包装器的目的是什么?
【发布时间】:2011-01-04 21:13:40
【问题描述】:

jQuery 开始将所有代码包装在一个匿名函数中:

(function ( window, undefined) {
   /*
   ...jquery code...
   */
}) (window);

我知道该函数在读取整个脚本后立即执行,但参数的目的是什么?一个是全局对象引用,另一个是属性引用。

现在,我记得在脚本开发的早期,未定义实际上被定义为其他东西(我记得对吗?)。和这个有关系吗?

另外,该函数似乎被用作运算符?就像上面一样,我根本不明白语句的语法。也许有上下文会有所帮助?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

包装器做了很多事情:

function(window,undefined)

为函数提供windowundefined 变量

匿名调用})(window); 将窗口变量传递给脚本。

如果用户覆盖窗口对象,他们将能够轻松修改脚本以使用正确的window 变量,即:

(function(window,undefined){})(w);

缺少传递的第二个参数将undefined 变量的值设置为undefined,这可以防止程序员通过覆盖undefined 来搞乱jQuery。

【讨论】:

  • 好的,我想我明白了(加上这个:mpathirage.com/files/javascript_ninja/…。所以,你可以在 jQuery 加载后操作窗口对象,它不会影响调用到这个的窗口对象功能?
  • 我认为最好让应用程序崩溃,让一些愚蠢的开发人员继续认为可以为 undefined 赋值,除非有意混淆任何人查看他的代码。
  • @Dexter 不完全是。 JS 中的对象是通过引用传递的(有点),所以修改传递给 jQuery 的窗口对象仍然会影响 jQuery 维护的对窗口对象的引用,但它允许你用一些新对象覆盖窗口对象.即 window.foo = 'bar' 可以在 jQuery 中访问,但 window = {foo:'bar'} 不能。
  • @mikerobi 如果您在函数范围内为 undefined 赋值,那么它不会伤害其他脚本,对吧?另外,您可以将其设置为更可控的,这样当您的脚本遇到未定义的错误时,创建更简单的错误处理。
  • 顺便提一下,ECMAScript 5 指定 undefined 变量是不可变的。当然,鉴于浏览器的性质,jQuery 不能假设当前版本是 ECMAScript 5。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多