今天做筆試題患朱,好多關(guān)于JS閉包問(wèn)題炊苫,就整理出來(lái),分享一下姐直。
首先蒋畜,引用下所謂的“官方解釋”:所謂“閉包”撞叽,指的是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分科展。
請(qǐng)注意加粗部分糠雨,會(huì)有益于你的理解。
來(lái)看例子1:
function a(){
var i = 1;
function b(){
alert(i);
}
return b();
}
var c = a(); c; // a();
例子2:
function a(){
var i = 1;
function b(){
alert(i);
}
return b;
}
var c = a(); c(); // a()();
上述兩個(gè)例子的運(yùn)行結(jié)果都是一樣的琅攘,只不過(guò)應(yīng)該會(huì)有很少人用例子2那樣結(jié)尾a()()
那樣的寫(xiě)法吧松邪。嘻嘻,我也是今天才發(fā)現(xiàn)的剧辐。這樣寫(xiě)的話(huà)邮府,你是不是對(duì)函數(shù)后面的括號(hào)()
有了更深的理解呢?
沒(méi)錯(cuò)忍啤,從上面我們可以看出來(lái)紊服,函數(shù)聲明定義時(shí)肯定少不了身份證()
胸竞,而當(dāng)把一個(gè)函數(shù)名連帶括號(hào)()
也賦給一個(gè)變量参萄,這時(shí)的變量其實(shí)是指向了這個(gè)函數(shù)體,也就是說(shuō)把函數(shù)體的指針(地址)賦給了此變量校赤。像上面例子2結(jié)尾那樣筒溃,a()()
中的前面部分a()
返回值(結(jié)果)是一個(gè)函數(shù)名(指向函數(shù)名的指針),也就是說(shuō)不會(huì)執(zhí)行浑测。所以要在a()
后面再加一個(gè)()
歪玲,才會(huì)執(zhí)行,相當(dāng)于b()
岖圈。因?yàn)?code>a()的返回值是b
钙皮,a()
()
也就相當(dāng)于b
()
。
插播結(jié)束导匣,返回來(lái)說(shuō)“閉包”問(wèn)題茸时。
繼續(xù)看例子:
function a(){
var i = 1;
alert(i);
}
function b(){
alert(i);
}
b();
上面的例子是會(huì)報(bào)錯(cuò)的:
現(xiàn)在返回去繼續(xù)想“閉包”屹蚊,你好驚奇的發(fā)現(xiàn)厕氨,例1和例2里,變量c竟然可以彈出了
i
汹粤!它可是沒(méi)有在變量c的同級(jí)作用域定義過(guò)懊!但是——因?yàn)椤伴]包”的存在:函數(shù)b()
以及函數(shù)a里的變量i
嘱兼。
注意
上面提到的国葬,“閉包”是包含著函數(shù)b()
以及變量i
,好多網(wǎng)上的文章只簡(jiǎn)單的提到了函數(shù)b()
,我認(rèn)為汇四,結(jié)合開(kāi)篇中的“官方說(shuō)法”接奈,那種說(shuō)法是不精確的。(變量也是表達(dá)式(閉包)的一部分)
至于閉包的作用通孽,對(duì)于垃圾回收機(jī)制的好處云云,暫時(shí)還沒(méi)有學(xué)習(xí)到背苦,后續(xù)會(huì)繼續(xù)更新補(bǔ)充互捌。