函數常見的幾種表現形式:javascript
1.通常形式(函數聲明):html
會進行函數的預解釋,函數會進行聲明和定義,在函數體前面或則後面均可以進行調用。java
2.函數表達式(匿名函數):jquery
會進行函數的預解析,函數會進行聲明可是不會定義(賦值),只能在函數體後面進行調用。閉包
3.匿名函數:函數
匿名函數屬於函數表達式,javascript引擎將開頭的function關鍵字看成函數聲明但未進行賦值操做。3d
函數聲明和函數表達式的區別:htm
一:Javascript引擎在解析javascript代碼時會‘函數聲明提高'(Function declaration Hoisting)當前執行環境(做用域)上的函數聲明,而函數表達式必須等到Javascirtp引擎執行到它所在行時,從上至下解析函數表達式。blog
2、函數表達式後面能夠加括號當即調用該函數,函數聲明不能夠,只能以fnName()形式調用 。ip
瞭解了函數常見的幾種表現形式,咱們再來看看當即執行函數兩種表現形式:( function(){…} )()和( function (){…} () ),兩種寫法是等價的。當即執行函數能作到當即執行,不存在預解析。
在function前面加!、+、 -甚至是逗號等到均可以起到函數定義後當即執行的效果,而()、!、+、-、=等運算符,都將函數聲明轉換成函數表達式,消除了javascript引擎識別函數表達式和函數聲明的歧義,告訴javascript引擎這是一個函數表達式,不是函數聲明,能夠在後面加括號,並當即執行函數的代碼。
拓展:當多個當即執行函數運行過程當中拋出錯誤的相關解析。
根據ECMAScript規範分號自動插入規則,能夠知道第一個當即執行函數後沒有自動插入";",因此致使最後解析出來的結果如圖所示:
解決辦法,在第一個當即執行函數後面加上";"。
優勢:javascript中沒有私有做用域的概念,多人開發過程當中在全局或局部做用域中聲明瞭一些變量,可能會被其餘人不當心用同名的變量給覆蓋掉,根據javascript函數做用域鏈的特性,可使用這種技術能夠模仿一個私有做用域,用匿名函數做爲一個「容器」,「容器」內部能夠訪問外部的變量,而外部環境不能訪問「容器」內部的變量,因此( function(){…} )()內部定義的變量不會和外部的變量發生衝突,俗稱「匿名包裹器」或「命名空間」。深刻能夠了解下我另外一篇關於閉包的知識點。
舉例:JQuery使用的就是這種方法,將JQuery代碼包裹在( function (window,undefined){…jquery代碼…} (window)中,在全局做用域中調用JQuery代碼時,能夠達到保護JQuery內部變量的做用。
好了,謝謝你這麼帥,還能看完個人分享,但願對你有所幫助(辛辛苦苦寫了那麼多,兄dei,點個贊再走吧),送你一朵❀。