在談到閉包前,要先談談範圍鏈
在 ES6 以前,變數透過 var 宣告,當時切分變數的最小單位為「函式」,有以下特性需要留意:
let a = "A";
function fn1() {
let b = "B";
fn2();
function fn2() {
let c = "C";
//可以取得外層所有變數
console.log(a, b, c);
}
}
fn1();
//error,因為無法取得 b,c 變數
console.log(a, b, c);
認識完範圍鏈,就來看看閉包吧!
假設 a 是外部函式,b 是存在於 a 裡面的內部函式
以往做計數器時,會在全域環境宣告一個變數來記錄數字,會出現全域變數,造成多個開發者之間命名衝突
//全域變數
let count = 0;
function add() {
return ++count;
}
console.log(add());
使用閉包寫法
function addFunc() {
let count = 0;
function add() {
return ++count;
}
return add;
}
//addFunc() 會回傳 add() 整個 function
//之後呼叫 result 等同於呼叫 add() 這個內部函式
let result = addFunc();
console.log(result());
注意:若缺少 let result = addFunc()
這個動作,直接寫 addFunc()
,回傳的會是 add 整個 function,而不是計算結果
希望看完這篇有更認識閉包這個觀念,若有錯誤也歡迎指正,謝謝看到這裡的大家。