最大的作用是創建一個獨立的作用域
用IIFE(匿名函數立即執行)實現,針對不需要復用的功能模塊可以用IIFE完全消除全局變量,所以一般IIFE都是用來輔助命名空間/模塊化方式的
函數表達式后面加上括號可以立即調用該函數,但是函數聲明不可以
例如:function a(){}后直接加()不能實現立即執行 function(){}()(錯誤);
但在function前面加!、+、 -甚至是逗號等到都可以起到函數定義后立即執行的效果,而()、!、+、-、=等運算符,都將函數聲明轉換成函數表達式,消除了javascript引擎識別函數表達式和函數聲明的歧義,告訴javascript引擎這是一個函數表達式,不是函數聲明,可以在后面加括號,并立即執行函數的代碼。
加括號是最安全的做法,因為!、+、-等運算符還會和函數的返回值進行運算,有時造成不必要的麻煩。
Paste_Image.png
原因:
JavaScript引擎規定,如果function關鍵字出現在行首,一律解釋成語句。因此,JavaScript引擎看到行首是function關鍵字之后,認為這一段都是函數的定義,不應該以圓括號結尾,所以就報錯了。
意義:
目前看來最大的作用創建一個獨立的作用域,隔離作用域,因為直到ES5為止JS里都只有函數作用域,沒有局部作用域。那么要隔離作用域就只能把代碼用一個函數框起來了,然后用所謂立即執行函數的方式。
補充:還有創建閉包函數