函數聲明和函數表達式


1.函數聲明

函數聲明以function關鍵字開頭,接着是必須的函數(變量)名和以逗號分隔的可選的參數列表,再接着就是以大括號封裝的函數體。函數聲明必須是一個單獨的JavaScript語句。

基本語法:

function funName(arg1,arg2){ //... }

  

另外,需要注意的是,函數在運行時所有聲明變量或聲明函數都會被提升到當前函數的頂部。

例如下代碼:

console.log('m' in window);//true
var m = 0;
 

代碼執行時js引擎會將聲明語句提升至代碼最上方,變為:

 
var m;
console.log('m' in window);//true
m = 0;

2.函數表達式

在任何情況下都是其它JavaScript語句的一部分(比如賦值表達式等號的右側、函數的參數)的函數被稱為函數表達式。

函數表達式最大的問題,在於js會將此代碼拆分為兩行代碼分別執行。

 

例如下代碼:

 
console.log(m);//輸出:function m(){}
var m=1;
function m(){}


 

實際執行的代碼為,先將 var m=1 拆分為 var m; 和 m = 1; 兩行,再將 var m; 和 function m(){} 兩行提升至最上方變成:

 
var m;
function m(){}
console.log(m);
m=1;
 

所以最終函數聲明的m覆蓋了變量聲明的m,輸出結果為m函數。

m();//m is not defined

var m = function(){

        console.log('n');
}   

 這個例子里雖然變量m聲明提前了,但其后面所接函數表達式仍在原來的位置,所以結果會報錯。

 

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


 
     
 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com