閉包
function A(){ function B(){ console.log("hello world"); } return B; } var c = A(); c();//hello world
這就是一個最簡單的閉包
翻譯為自然語言如下
- 定義普通函數A
- 在A中定義普通函數B
- 在A中返回B
- 執行A,並把A執行結果賦值給變量C
- 執行C
當一個內部函數被其外部函數之外的變量引用時,就形成了一個閉包。
立即執行函數
此類函數沒有聲明,再一次執行過后即釋放。適合做初始化工作
//立即執行函數 也會有預編譯的過程 var num = (function(a,b,c){ var d= a+b+c*2-2; return d; }(1,2,3))
立即執行函數的兩種寫法
- (function(){}()); W3C 建議第一種
- (function(){})();
關鍵點補充:
- 只有表達式才能被執行符號執行
//此為函數聲明,不可以被執行符號執行
function test(){ var a = 123; }();
- 能被執行符號執行會忽略函數的名稱
//&& || + - ! 會讓函數聲明變成表達式,加上執行符號 即立即執行函數,然后忽略函數名稱 !function test(){ }()
所以立即執行函數可寫成
(function(){}());
例題
function test(a,b,c,d){ console.log(a+b+c+d); }(1,2,3,4);
正常不能執行,系統識別成了
function test(a,b,c,d){ console.log(a+b+c+d); } (1,2,3,4);
這樣就不會報錯,但並不是立即執行函數