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