除了用function
命令聲明函數,還能夠採用變量賦值的寫法。javascript
這種寫法將一個匿名函數賦值給變量。這時,這個匿名函數又稱函數表達式(Function Expression),由於賦值語句的等號右側只能放表達式。java
採用函數表達式聲明函數時,function
命令後面不帶有函數名。若是加上函數名,該函數名只在函數體內部有效,在函數體外部無效。瀏覽器
上面代碼在函數表達式中,加入了函數名x
。這個x
只在函數體內部可用,指代函數表達式自己,其餘地方都不可用。函數
這種寫法的用處有兩個:工具
1 .是能夠在函數體內部調用自身;google
2 .是方便除錯(除錯工具顯示函數調用棧時,將顯示函數名,而再也不顯示這裏是一個匿名函數spa
所以,下面的形式聲明函數也很是常見。3d
須要注意的是,函數的表達式須要在語句的結尾加上分號,表示語句結束。code
demo1blog
在Javascript中,一對圓括號()
是一種運算符,跟在函數名以後,表示調用該函數。好比,print()
就表示調用print
函數。
有時,咱們須要在定義函數以後,當即調用該函數。這時,你不能在函數的定義以後加上圓括號,這會產生語法錯誤。
產生這個錯誤的緣由是,function
這個關鍵字便可以看成語句,也能夠看成表達式。
爲了不解析上的歧義,JavaScript引擎規定,若是function
關鍵字出如今行首,一概解釋成語句。所以,
JavaScript引擎看到行首是function
關鍵字以後,認爲這一段都是函數的定義,不該該以圓括號結尾,因此就報錯了。
解決方法就是不要讓function
出如今行首,讓引擎將其理解成一個表達式。最簡單的處理,就是將其放在一個圓括號裏面。
上面兩種寫法都是以圓括號開頭,引擎就會認爲後面跟的是一個表示式,而不是函數定義語句,因此就避免了錯誤。
這就叫作「當即調用的函數表達式」(Immediately-Invoked Function Expression),簡稱IIFE。
注意,上面兩種寫法最後的分號都是必須的。若是省略分號,遇到連着兩個IIFE,可能就會報錯。
在google瀏覽器下,顯示錯誤以下:
上面代碼的兩行之間沒有分號,JavaScript會將它們連在一塊兒解釋,將第二行解釋爲第一行的參數。
推而廣之,任何讓解釋器以表達式來處理函數定義的方法,都能產生一樣的效果,好比下面三種寫法。