什么是閉包?
總結(jié):
1,有函數(shù)嵌套
2,內(nèi)部函數(shù)被外部訪問,暴露出了句柄「return 內(nèi)部函數(shù)」
上菜
圖片.png
圖片.png
圖片.png
特點(diǎn)
1,暴露出來的這個函數(shù)有被調(diào)用的可能性「return 內(nèi)部函數(shù)」,外部函數(shù)就永遠(yuǎn)不能被釋放「內(nèi)存泄漏」
內(nèi)存泄漏是什么意思?
一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進(jìn)程結(jié)束(關(guān)閉瀏覽器)。
function xx(){
var b={name:"pear"}
var a=1
console.log(a)
}
上面代碼里面的b就造成了內(nèi)存泄漏,當(dāng)xx()執(zhí)行完后,只是釋放了棧里面的b,但是內(nèi)存里面的數(shù)據(jù)不會釋放
非常容易錯的一個coding
圖片.png
修改:在for循環(huán)外部添加一層function包裹
怎么解決這個問題呢?我們需要每個li都綁定點(diǎn)擊事件
立即執(zhí)行函數(shù)
完整代碼
圖片.png
2,外部能訪問函數(shù)內(nèi)部的變量
定義全局變量:
var global= null;
function fn1(){
var str1="1";
function fn2(){
console.log(str1);
}
global=fn2;
}
fn1()//執(zhí)行了這行,才能得到global=fn2的賦值
global();//1
返回值:
function fn1(){
var str1="1";
function fn2(){
console.log(str1);
}
return fn2;
}
var str=fn1()//執(zhí)行了這行,才能得到str=fn2的賦值
str();//1
閉包的好處,有豆腐塊的命名空間
圖片.png
這和模塊化編程有必然的聯(lián)系
現(xiàn)在不是很懂為什么$變量不會被覆蓋?
參考文章:
方方老師 JS中的閉包是什么?
阮一峰