1.函數聲明
函數聲明以function關鍵字開頭,接着是必須的函數(變量)名和以逗號分隔的可選的參數列表,再接着就是以大括號封裝的函數體。函數聲明必須是一個單獨的JavaScript語句。
2.函數表達式
在任何情況下都是其它JavaScript語句的一部分(比如賦值表達式等號的右側、函數的參數)的函數被稱為函數表達式。
3.比較
//函數聲明
function myFunctionDeclaration(){ function innerFunction() {} } //以下為函數表達式 var myFunc = function(){}; myFunc(function(){ return function(){}; }); (function namedFunctionExpression () { })(); +function(){}(); -function(){}(); !function(){}(); ~function(){}();
myFunctionDeclaration 是一個包含其它函數聲明(innerFunction)的函數聲明
函數表達式總是其它JavaScript語句的一部分,比如變量聲明等號的右側:
var myFunc = function(){};
或者其他函數的參數:
myFunc(function() {
return function(){};
});
或者立即執行函數:
(function namedFunctionExpression () { })();
或者被為運算符修飾:
+function(){}();
函數聲明與函數表達式除了以代碼放的位置不同區別,還有一點不同,那就是函數聲明必須有函數名,而函數表達式的函數名可以省略。
函數聲明必須有函數名是因為函數被調用的基本要求,在調用一個函數時我們必須能夠引用它,而唯一的方法就是通過函數名。
函數表達式是其它JavaScript語句的一部分,所以我們有別的方式引用它們,比如函數被賦值給一個變量,可以通過變量名來訪問:
var doNothing = function(){}; doNothing();
或者作為其它函數的參數,可以通過參數名訪問:
function doSomething(action) { action(); }
關於立即執行函數:
立即執行函數必須用括號包裹,原因很簡單,JavaScript解析器需要區分函數聲明和函數表達式,如果省略函數外邊的括號,並且直接調用( function(){}(2)此處函數外面沒有括號),
JavaScript解析器開始解析,並且結束執行,因為這條語句是以function關鍵字開始,被當作函數聲明,由於函數聲明必須要有函數名,因此會拋出異常。函數外邊的括號會給JavaScript解析器這是一個函數表達式的信號。為了達到相同的目的,也可以這樣寫:
(function (a){}(3)),括號的作用和上面相同。
位運算符的作用和上面也是相同的。