函數內容新增——函數表達式

   函數表達式

除了用function命令聲明函數,還能夠採用變量賦值的寫法。javascript

這種寫法將一個匿名函數賦值給變量。這時,這個匿名函數又稱函數表達式(Function Expression),由於賦值語句的等號右側只能放表達式。java

採用函數表達式聲明函數時,function命令後面不帶有函數名。若是加上函數名,該函數名只在函數體內部有效,在函數體外部無效。瀏覽器

上面代碼在函數表達式中,加入了函數名x。這個x只在函數體內部可用,指代函數表達式自己,其餘地方都不可用。函數

這種寫法的用處有兩個:工具

      1 .是能夠在函數體內部調用自身;google

      2 .是方便除錯(除錯工具顯示函數調用棧時,將顯示函數名,而再也不顯示這裏是一個匿名函數spa

所以,下面的形式聲明函數也很是常見。3d

須要注意的是,函數的表達式須要在語句的結尾加上分號,表示語句結束。code

demo1blog

當即調用的函數表達式(IIFE)

在Javascript中,一對圓括號()是一種運算符,跟在函數名以後,表示調用該函數。好比,print()就表示調用print函數。

有時,咱們須要在定義函數以後,當即調用該函數。這時,你不能在函數的定義以後加上圓括號,這會產生語法錯誤。

產生這個錯誤的緣由是,function這個關鍵字便可以看成語句,也能夠看成表達式。

爲了不解析上的歧義,JavaScript引擎規定,若是function關鍵字出如今行首,一概解釋成語句。所以,

JavaScript引擎看到行首是function關鍵字以後,認爲這一段都是函數的定義,不該該以圓括號結尾,因此就報錯了。

解決方法就是不要讓function出如今行首,讓引擎將其理解成一個表達式。最簡單的處理,就是將其放在一個圓括號裏面。

上面兩種寫法都是以圓括號開頭,引擎就會認爲後面跟的是一個表示式,而不是函數定義語句,因此就避免了錯誤。

這就叫作「當即調用的函數表達式」(Immediately-Invoked Function Expression),簡稱IIFE。

注意,上面兩種寫法最後的分號都是必須的。若是省略分號,遇到連着兩個IIFE,可能就會報錯。

 

在google瀏覽器下,顯示錯誤以下:

上面代碼的兩行之間沒有分號,JavaScript會將它們連在一塊兒解釋,將第二行解釋爲第一行的參數。

推而廣之,任何讓解釋器以表達式來處理函數定義的方法,都能產生一樣的效果,好比下面三種寫法。

一般狀況下,只對匿名函數使用這種「當即執行的函數表達式」。它的目的有兩個:
    一是沒必要爲函數命名,避免了污染全局變量;
    二是IIFE內部造成了一個單獨的做用域,能夠封裝一些外部沒法讀取的私有變量。 
上面代碼中,寫法二比寫法一更好,由於徹底避免了污染全局變量。
小例子:
相關文章
相關標籤/搜索