當一個函數被建立時,閉包就會被產生,雖然常見的閉包說明方式會使用巢狀函數當作例子,這是最常見的例子沒錯,但是並不是只有巢狀函數才能產生閉包。
直接舉一個例子:
function func() { // func1引用了它外層的變數a,因此func成為了閉包
let a = 123
function func1() {
console.log(a) //訪問了外層的func內的a
debugger;
}
func1();
}
func()
上圖可得知函數建立時就會存在閉包了,再進入call stack中的func1
進入func1後,可以發現closure進到了Scope,代表閉包也算是作用域的一種。
直接舉一個例子說明:
function getIntro(height,weight) {
function addString() {
console.log(`身高${height},體重${weight}`)
}
return addString
}
let getIntroString = getIntro(180,70);
getIntroString();
另外返回的function是可以重複且獨立使用,閉包內的變數是互相獨立的,舉個例子:
function plusNum() {
let initNum = 100;
return function(num = 0) {
initNum+=num
console.log(`current num is ${initNum}`)
}
}
let plusNumA = plusNum();
plusNumA(); // current num is 100
plusNumA(10); // current num is 110
plusNumA(20); // current num is 130
let plusNumB = plusNum();
plusNumB(); // current num is 100
plusNumB(20); // current num is 120
plusNumB(40); // current num is 160