【问题标题】:In javascript what does this syntax `(function(window,undfined)){}(window)` accomplish在 javascript 中,这种语法 `(function(window,undefined)){}(window)` 完成了什么
【发布时间】:2010-11-08 19:25:39
【问题描述】:

我试图了解如何像 jQuery 那样将 JavaScript 事件“链接”在一起。我在 S.O. 上发现了一个问题。这与我的目标相似,但我不明白答案中的代码。

Code Source

(function( window, undefined ) { 
...etc...
}(window)

这是什么意思?它在做什么?它让我想起了 Jquery 的 $(document).ready(){} 函数,但我不知道为什么这个人将他的代码包装在这个匿名函数中,通过 windowundefined

我的最终目标是弄清楚如何通过像 jQuery 一样将方法链接在一起来在对象上执行方法。我知道 jQuery 已经做到了这一点,但我主要是为了作为开发人员的成长。

【问题讨论】:

标签: javascript jquery scripting object


【解决方案1】:

它定义了一个函数(使用function operator 而不是function statement)。它周围的括号确保它被视为运算符而不是语句。

然后它立即执行它,将window 作为参数传递。

本质上,这与:

var myFunction = function( window, undefined ) { 
...etc...
};
myFunction(window);

…但没有间隙变量。

这与 jQuery 风格的函数链接无关,其中每个方法实际上都以 return this 结尾(因此在另一个方法的返回值上调用一个方法与在原始对象上调用它是一样的)。

【讨论】:

  • 感谢您区分函数运算符和函数语句。另外,感谢您指出 jQuery 链接是由 return this 完成的,而不是上面的语法。
【解决方案2】:

当一个函数被调用的参数少于其签名所包含的参数时,尾随参数被赋值为undefined

所以上述方法是获取undefined 值的一种迂回方式,即使某些疯子通过说var undefined= 'hello'; 重新定义了它。 (这在 ECMAScript 第五版的“严格模式”中无论如何都是非法的,但 JavaScript 编码器有时会做一些奇怪的事情。)

虽然没有像这样传递window 的充分理由......如果你不能依赖window,获取window 的传统方法是直接调用一个函数并使用@ 987654327@.

无论哪种方式,这只是针对病态作者 JavaScript 的防御性编码。这不是您在编写自己的代码时应该担心的事情(在任何情况下,您都无法阻止每一种有人可能会弄乱他们的 JS 环境),并且与链接无关。 p>

【讨论】:

  • 感谢您解释为什么会有这些论点。
  • 是的,在严格模式下你会得到一个SyntaxError 异常,而在非严格的 ES5 代码上,赋值只会默默地失败,global.undefined 属性不可写:-)跨度>
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2012-05-21
相关资源
最近更新 更多