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


     hello,沐晴又來更新啦,今天呢,跟大家講講讓人頭疼的函數表達式和函數聲明,反正我當初看那本高級程序的時候,是沒怎么看太透,哈哈。我是個比較重基礎的人,跟我一起探討函數表達式和函數聲明的世界吧。

首先呢,先看看他們的顏值:

 

 函數聲明:function 函數名(){}

  函數表達式:function 函數名(可寫可不寫)(){};

 (不寫名叫做匿名函數表達式。寫名叫做命名函數表達式。推薦用匿名的。)

這么一看長的好像沒啥區別,反正顏值也都不高。那么我們如何區別是函數表達式還是函數聲明呢?答案就是看上下文,何謂上下文,你懂的,就像語文作文里面的上下文。

函數聲明:function aaa(){} (這種就是函數聲明,上下文啥也木有。)

函數表達式:
var a = function aaa(){} : 命名函數表達式
var a = function (){} :匿名函數表達式
(function aaa(){}) : 表達式 
位運算符:
~funtion aaa(){} : 表達式 
-funtion aaa(){} : 表達式 
+funtion aaa(){} : 表達式 
!funtion aaa(){} : 表達式

(有上面的這些表現形式的都是函數表達式)

OK,看了表現上的不一樣,我們已經知道如何區別他們了,下面就來了解一下他們真正在使用上的區別

1 函數表達式可以直接后面加括號執行 而函數聲明是不可以。

function aaa(){}(); // 不可以執行。必須得通過函數名調用 aaa();
var a = function aaa(){} (); // 加括號就可以直接執行  

2 函數聲明可以提前被解析出來。表達式不可以。

比如,只要你聲明過函數,不管函數是在哪個位置聲明的,它都會被提前解析出來,所以在任何地方調用都不會有問題。但是函數表達式不會被提前解析,所以你能在函數表達式之前就調用它。(關於解析機制,下篇我會認真的寫出來分享給大家。)

aaa(); //可以調用

a(); //調用會出錯

function aaa(){}; // 函數聲明
var a = function aaa(){}; // 函數表達式

主要的就是這兩方面的區別,相對於函數聲明,表達式可以讓我們不用費勁想那么多函數名,代碼也更簡單,等到我寫閉包的時候,會體現它的優點。

 

好的,今天的探討就到這里了,如有錯誤,歡迎指正。我是沐晴。下篇不見不散。

 


免責聲明!

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



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