閉包

今天有人問我什么是閉包,我說(shuō):技術(shù)上講,javascript函數(shù)都是閉包,只要你返回的局部變量。目測(cè)對(duì)我的話表示深深懷疑。

首先來(lái)談什么是閉包?

函數(shù)對(duì)象可以通過(guò)作用域連相互關(guān)聯(lián)起來(lái),函數(shù)內(nèi)部的變量都可以保留在函數(shù)的作用域內(nèi),這種特性在計(jì)算機(jī)文獻(xiàn)中被稱為"閉包"。而不是緊緊理解為函數(shù)嵌套函數(shù) return目標(biāo)變量。

1.函數(shù)嵌套函數(shù)


圖1

打開瀏覽器控制臺(tái)輸出1,閉包的確實(shí)現(xiàn)了我們想要的效果,由于作用域的關(guān)系,本身我們是拿不到 b 變量的值。如果不用閉包為什么拿不到 b 的值呢?因?yàn)樵诤瘮?shù)執(zhí)行結(jié)束 b的引用計(jì)數(shù)為0 就被銷毀了。而在閉包中 fn2函數(shù)最后 return 了 b 變量,b 變量的引用計(jì)數(shù)就不是0了。因此 b 變量仍然保留在作用域連中,這也就導(dǎo)致了一個(gè)問題,使用不好閉包會(huì)導(dǎo)致內(nèi)存被大量占用。

2.為什么我說(shuō)從技術(shù)角度上 返回內(nèi)部變量的javascript 函數(shù)都是閉包


圖2

fn3僅僅有一個(gè)函數(shù),函數(shù)也是對(duì)象并且他們都關(guān)聯(lián)到作用域連。運(yùn)行這段代碼控制臺(tái)輸出1,變量 c 也被保存到作用域連中,函數(shù)執(zhí)行結(jié)束也沒有將 c 變量銷毀。

所以從技術(shù)角度上 返回內(nèi)部變量的javascript 函數(shù)都是閉包。不要僅僅限于常見的函數(shù)嵌套函數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 王福朋 - 博客園 —— 《 深入理解javascript原型和閉包》 目錄:深入理解javascript原型和閉...
    帥而不花__美而不浪閱讀 1,632評(píng)論 0 2
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一、變量...
    zock閱讀 1,118評(píng)論 2 6
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一、變量...
    zouCode閱讀 1,362評(píng)論 0 13
  • 閉包: 官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該...
    小裁縫sun閱讀 711評(píng)論 0 5
  • 本章將會(huì)介紹 閉包表達(dá)式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動(dòng)閉包枚舉語(yǔ)法使用Switch語(yǔ)句匹配枚舉值關(guān)聯(lián)值原...
    寒橋閱讀 1,629評(píng)論 0 3

友情鏈接更多精彩內(nèi)容