JS: 立即執行函式

在討論前端的時候,我們總能聽到立即執行函式。我第一次聽到這個名字的時候總以為很高大上,每次都想以後有機會好好學一下。但其實立即執行函式是個很簡單的概念,而且我們可能每天都在用,只是忽略了而已。
概念
立即執行函式 = 立即要去執行的函式 = 定義完了就去執行。簡單來說就是:
function fn() { console.log("Hello World") } fn()
沒了。
由來
這很簡單呀,好像很常見嘛,Java,C都會出現這樣的程式碼呀。比如 Java 裡:
class Man() { public int static main(String[] args) { fn(); } private void fn() { System.out.println("Hello World"); } }
或者 C:
void fn() { printf("Hello World"); } int main() { fn(); }
反正就是在入口裡去呼叫定義好了的函式嘛。雖然看起來意思差不多,但是意義卻不一樣。在沒有 let
和 const
的時代,JS 是沒有塊級作用域的,只有函式作用域。如果要宣告一個區域性變數可能放在函式裡,這樣外面的變數才不會訪問到裡面的變數。
function fn() { var a = 1 } console.log(a) // => 報錯,a undefined
所以呀,如果要造一個塊級作用域只能靠函式來搞了。假如 ES6 的程式碼是這樣:
{ let a = 1 }
那麼以前的寫法就是這樣的:
function fn() { var a = 1 } fn()
你看這裡的 a
就是區域性變量了,同時也出現我們所說的立即函數了。
變一下
有人可能會說了,我見的立即函式都不是這樣呀,都是奇形怪狀的,在 function
之前加各種亂七八糟的符號。
別忘記了,我們上面的立即函式還在全域性聲明瞭一個叫 fn 的函式呢,這不得不償失嘛,所以 JS 程式設計師就這樣想:
function() { var a = 1 }()
但是不好意思,語法錯誤。

所以你可以:
- 用括號包住上面的整體
(function() { var a = 1 }())
- 在上面整體前加運算子號
!function() { var a = 1 }() +function() { var a = 1 }() -function() { var a = 1 }() ~function() { var a = 1 }()
反正原則就是搞得不報錯,同時不建立新的全域性函式變數就行了。個人推薦使用感嘆號 !
的寫法,畢竟意思更明確嘛,說明這個很重要~