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(){}; // 函數表達式
主要的就是這兩方面的區別,相對於函數聲明,表達式可以讓我們不用費勁想那么多函數名,代碼也更簡單,等到我寫閉包的時候,會體現它的優點。
好的,今天的探討就到這里了,如有錯誤,歡迎指正。我是沐晴。下篇不見不散。