函數聲明、函數表達式、匿名函數、立即執行函數詳解


 定義函數的方式有三種:

1.函數聲明:     function  函數名稱  (參數:可選)   {   函數體  }

2.函數表達式: var express= function  函數名稱:可選  (參數:可選)   {  函數體 }      

3.構造函數:     var fun =new  Function(參數:可選);

最常用的是函數聲明和函數表達式。

一:函數聲明

從上面的定義可以看出,函數聲明是以關鍵字function開頭聲明一個函數,然后必須具備一個函數名稱。

函數聲明有一個非常重要的特征函數聲明提升javascript引擎在解析代碼時,函數聲明將會被提升到當前作用域的頂部(跟變量提升非常類似)。正是因為這個特征,所以可以把函數聲明放在調用它的語句后面。

 如下例:

foo("hello");   //輸出  hello

function foo(name){

console.log(name);

}

二:函數表達式

從上面的定義可以看出,函數表達式是作為表達式語句的一部分存在;當它沒有函數名稱的時侯,則稱為匿名函數;

匿名函數:function ( 參數 ) { 函數體 }   匿名函數屬於函數表達式。

函數表達式與函數聲明的區別是:函數表達式必須等到Javascirtp引擎執行到它所在行時,才會從上而下一行一行地解析函數表達式,所以,調用它的語句不可以放在它之前。

如下例:

express();  //報錯,函數調用必須在函數表達式之后

console.log(express);  //undefined   變量提升

var express=function () {

console.log("hello word!");

}

三:立即執行函數

先看幾個例子:

var express=function () {

console.log("hello word!");

}();    //運行,發現函數直接執行,結果輸出了"hello word!"

 

function () {

console.log("hello word!");

}();   //報錯    Uncaught SyntaxError: Unexpected token )   

因為以function開頭,認為是函數聲明,結果沒有函數名,就報錯了

 

function foo() {
console.log("hello word!");
}();   //報錯    Uncaught SyntaxError: Unexpected token )    (注意:網上好多文章寫的不報錯,一看就沒有自己驗證過)   

雖然,這個function在語法上沒問題,但是依然只是一個語句,加上括號依然報錯,是因為語句中的分組操作符要包含表達式。

 

綜上,我們可以得到,在函數表達式后面緊跟一個小括號(),函數會立即執行,兩大要點是:表達式、括號();

所以,立即執行函數的寫法就是:

( function(){…} )() 或  ( function (){…} () )  

這里的括弧是消除歧義的,它告訴解析器,里面的內容是表達式。

 

 

 

 


免責聲明!

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



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