我現(xiàn)在的理解就是
閉包就是一個函數(shù),這個函數(shù)能訪問其他函數(shù)的作用域拳芙。
因?yàn)镴avaScript的函數(shù)比較特殊,
- 函數(shù)內(nèi)部能訪問外層作用域上的變量(作用域转培、作用域鏈)
let a = 1;
function f() {
console.log(a);
}
f();
- 函數(shù)內(nèi)能聲明函數(shù)浆竭、或者創(chuàng)建函數(shù)表達(dá)式
function f1() {
let sth = '本該銷毀的變量';
// 能在f1函數(shù)里惨寿,聲明f2函數(shù)
function f2() {
console.log(sth);
}
// 通過return删窒、事件綁定,將內(nèi)部函數(shù)保存到了外部
return f2;
}
let f2 = f1();
f2();
結(jié)果
在上面蕉拢,就形成了一個閉包诚亚。
正常來說,一個函數(shù)執(zhí)行完站宗,函數(shù)作用域內(nèi)變量的應(yīng)該銷毀,而閉包f2卻能訪問到f1的函數(shù)作用域夷家,導(dǎo)致內(nèi)存不能釋放敏释。如果不是某些特定任務(wù)需要使用閉包,在其它函數(shù)中創(chuàng)建函數(shù)是不明智的钥顽,因?yàn)殚]包在處理速度和內(nèi)存消耗方面對腳本性能具有負(fù)面影響。