了解jquery源代码

时间:2010-10-02 16:47:13

标签: javascript jquery

我最近开始深入研究JavaScript,并在JQuery中遇到过这个代码构造。

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

读取堆栈溢出(以及其他地方)我得出结论,这与

相同
function foo(window, undefined) {
    ...
}

foo(window);

我的假设是否正确? 如果是这样,前者的优势是什么? (除了令人困惑的新手)

3 个答案:

答案 0 :(得分:19)

要理解它,您需要了解一些事项:

  1. 这是一个匿名函数,只是意味着它没有名称。
  2. 声明声明后立即调用该函数。您在函数定义之后立即看到第2行的左括号?这意味着,“调用此函数”。
  3. 只有一个参数传递给该函数。该参数是“window”,它是浏览器内部全局范围的名称。
  4. 实际调用的函数需要 * 2 *参数,但我们用一个调用它。 Javascript允许您使用比函数实际预期更多或更少的参数调用函数。有一些方法可以访问传递的参数列表。
  5. 由于我们只传递一个参数,因此第二个参数将自动设置为“undefined”。 “undefined”是一个特殊的javascript值,意思是,准备好,“未定义”。
  6. 恰巧我们还命名我们的第二个参数,名称为“undefined”。因此,实际上,我们已经创建了一个局部变量(参数非常类似于局部变量),名为未定义,其值未定义。
  7. 为什么我们在地球上这样做?这是一种确保在我们的匿名函数中,如果我们引用“未定义”,它确实具有“未定义”值的方法。如果我们不这样做,并且我们范围之外的一些疯狂代码重新定义为“未定义”(通过说“undefined = 42”之类的东西),那么我们编写代码思维我们指的是未定义但我们实际上是这些恶作剧传递了1个参数,但期望2,并且第二个参数未定义,保护我们免受这种无意义的影响。
  8. 我希望这很清楚,如果不是,请告诉我。我从上面提到的Paul Irish的视频中学到了所有这些。

答案 1 :(得分:5)

这是一个匿名函数。它被创建然后超出范围,这是优势。它立即被创建和实例化。这样做的好处是它不会与全局命名空间中的任何函数发生冲突,因此不会删除您可能包含在页面上的任何内容。

答案 2 :(得分:1)

这是一个匿名函数,它有很多好处,比如只在当前范围内活动。 You can read more about it here.