javascript中聲明函數的方法有兩種:函數聲明式和函數表達式.究竟他們用起來有什麼區別呢?javascript
區別以下:java
(1)、以函數聲明的方法定義的函數,函數名是必須的,而函數表達式的函數名是可選的。函數
(2)、以函數聲明的方法定義的函數,函數能夠在函數聲明以前調用,而函數表達式的函數只能在聲明以後調用。spa
(3)、以函數聲明的方法定義的函數並非真正的聲明,他們僅僅能夠出如今全局中或者嵌套在其它函數中。3d
下面來看具體的例子吧。下面這兩種方式有什麼區別嗎?對象
function boo(){}; blog
var bar = function(){};ip
可能有些人知道,也有些人不知道,對於我而言,我是懵的,因此以爲有必要作下筆記。io
在ECMAScript中,有兩個最經常使用的建立函數對象的方法,即便用函數表達式或者使用函數聲明。對此,ECMAScript規範明確了一點,便是,即函數聲明 必須始終帶有一個標識符(Identifier),也就是咱們所說的函數名,而函數表達式則能夠省略。說到這裏,答案就不言而喻了(前一個是函數聲明,後一個是函數表達式)。function
也許有人會問那若是第二種方式也有函數名呢,好比這樣,var bar = function boo(){};其實它仍是函數表達式,由於它是賦值表達的一部分。
函數聲明:
function 函數名稱 (參數:可選){ 函數體 }
函數表達式:
function 函數名稱(可選)(參數:可選){ 函數體 }
因此,能夠看出,若是不聲明函數名稱,它確定是表達式,可若是聲明瞭函數名稱的話,如何判斷是函數聲明仍是函數表達式呢?ECMAScript是經過上下文來區分的,若是function boo(){}是做爲賦值表達式的一部分的話,那它就是一個函數表達式,若是function boo(){}被包含在一個函數體內,或者位於程序的最頂部的話,那它就是一個函數聲明。
還有一種函數表達式,就是被括號括住的(function boo(){}),他是表達式的緣由是由於括號 ()是一個分組操做符,它的內部只能包含表達式。
下面來看一個有趣的例子:
結果如何呢?剛看到這個的時候,我也作錯了。好了,運行結果是這樣的。
爲何會這樣呢,由於在第一次調用fn()的同時,var fn 變量沒有做爲全局對象的一個屬性而存在,且 fn 引用的匿名函數上下文也沒有被初始化,因此在他以前調用失敗。
如今把這段代碼稍微調整一下:
結果就會不同了。