您好,登錄后才能下訂單哦!
閉包
按中文的意思就是關(guān)上一個(gè)包的意思。如果我們把函數(shù)的作用域當(dāng)做是一個(gè)包的話,那這個(gè)詞很形象體現(xiàn)了它的作用 。函數(shù)的正常的執(zhí)行流程是當(dāng)函數(shù)中的語(yǔ)句執(zhí)行完后,程序會(huì)自動(dòng)銷(xiāo)毀這個(gè)函數(shù)的作用域,但是當(dāng)一個(gè)函數(shù)中聲明了另一個(gè)函數(shù),并且這個(gè)子函數(shù)執(zhí)行時(shí)存在引用父函數(shù)的變量,就會(huì)形成閉包,形象點(diǎn)說(shuō)就相當(dāng)于把父函數(shù)的作用域給關(guān)閉了起來(lái),不讓程序去銷(xiāo)毀它。
例如:
function a() { var name = "xuxu"; function b() { console.log(name); } // 此處產(chǎn)生閉包 b(); } a();
當(dāng)函數(shù)可以記住并訪問(wèn)它所在的作用域鏈時(shí),就產(chǎn)生了閉包 當(dāng)然,大部分的閉包都不是這么直觀的,因?yàn)樽雍瘮?shù)的調(diào)用是可以在父函數(shù)之外的,例如:
function a() { var name = "xuxu"; function b() { console.log(name); } return b; } var c=a(); // 此處產(chǎn)生閉包 此處的c函數(shù)其實(shí)就是a函數(shù) c();
通過(guò)以上代碼,我們也可以看出一個(gè)閉包的好處,就是我們?cè)偃肿饔糜颍ù颂幨莣idow)下訪問(wèn)到了局部作用域(a函數(shù))的作用域的值,按正常的詞法作用域是無(wú)法這么做的,但是當(dāng)我們使用閉包是就可以了。然后我們?cè)倏匆稽c(diǎn)我們平時(shí)寫(xiě)的比較多的:
function foo() { var a = 2; function baz() { // 2 console.log( a ); } bar( baz ); } function bar(fn) { // 大家快看呀,這就是閉包! fn(); }
又或者
var fn; function foo() { var a = 2; function baz() { console.log( a ); } // 將baz分配給全局變量 fn = baz; } function bar() { // 大家快看呀,這就是閉包! fn(); } foo(); // 2 bar();
以上也是閉包,因此在函數(shù)內(nèi)部調(diào)用子函數(shù),或者通過(guò)何種手段將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會(huì)持有對(duì)原始定義作用域的引用,無(wú)論在何處執(zhí)行這個(gè)函數(shù)都會(huì)使用閉包。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。