函數聲明與函數表達式的區別


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)),括號的作用和上面相同。
位運算符的作用和上面也是相同的。


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM