了解jquery源代码

Eli*_*ija 7 javascript jquery

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

(function( window, undefined ) {
})(window)
Run Code Online (Sandbox Code Playgroud)

阅读堆栈溢出(和其他地方)我得出结论,这是相同的

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

foo(window);
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ers 19

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

  1. 它是一个匿名函数,只是意味着它没有名称.
  2. 声明后立即调用该函数.您在函数定义之后立即看到第2行的左括号?这意味着,"调用此功能".
  3. 只有一个参数传递给函数.该参数是"window",它是浏览器内部全局范围的名称.
  4. 被调用的函数实际上需要*2*参数,但我们用一个调用它.Javascript允许您使用比函数实际预期更多或更少的参数调用函数.有一些方法可以获取传递的参数列表.
  5. 由于我们只传递一个参数,因此第二个参数将自动设置为"undefined"."undefined"是一个特殊的javascript值,意思是,准备好,"未定义".
  6. 碰巧我们还将名称为"undefined"的第二个参数命名为.因此,实际上,我们创建了一个名为 undefined 的局部变量(参数非常类似于局部变量),其值未定义.
  7. 为什么我们在地球上这样做?这是一种确保在我们的匿名函数中,如果我们引用"未定义",它确实具有"未定义"值的方法.如果我们不这样做,我们的范围重新定义了"不确定"之外的一些疯狂的代码(说像"未定义= 42"),那么我们会写我们指的是未定义代码的思维,但我们会实际上是这些诡计通过1个参数但期望2,并且将第二个参数定义为未定义,保护我们免受这种无意义的影响.

我希望这很清楚,如果不是,请告诉我.我从上面提到的Paul Irish的视频中学到了所有这些.


Sco*_*ott 5

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