以下是一个函数声明。它可以独立存在。
function foo(){
alert("This is an alert");
}
可以这样“调用”(执行)它:
foo();
以下是一个函数表达式(例如匿名函数**见底部的编辑**)。
像任何其他表达式一样,它就像一个rvalue,您可以将其分配给变量。
var f = function (){
alert("This is an alert");
};
然后,可以像这样“调用”(执行)它:
f();
或者您可以像这样对其使用运算符:
(function (){
alert("This is an alert");
})();
请注意,现在可以将此变量作为参数传递给其他函数!(即我们可以将函数作为参数传递)。
现在,让我们分析一下:
(function( window, undefined ) {
//blah blah blah -1
//blah blah blah -2
})(window);
这可以分为两个部分:
var f = function( window, undefined ) {
};
f(window);
函数(分配给f)传入2个参数,
window
和
undefined
。我们将第一个参数作为
window
(由浏览器提供给调用者的全局对象)。请注意,我们没有传递任何第二个参数。但是由于我们期望函数中有第二个参数,但没有传递任何参数,因此Javascript解释器将会将
undefined
值(如解释器所定义)赋值给它。因此,变量(参数)
undefined
现在包含未定义的值。
接受这两个值作为参数的主要目的是使函数独立于全局变量。(想象一下,如果某个JS脚本或浏览器插件将未定义的值更改为其他值,会发生什么!!)
Refer:
https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Functions
https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators
编辑:
正如@FelixKling所评论的那样,函数表达式不必是匿名的,它们可以有名称。
var f = function foo(){
alert("This is an alert");
}
这篇是关于他们使用情况的有趣文章。