閉包

如何產(chǎn)生閉包?

  • 當(dāng)一個(gè)嵌套的內(nèi)部(子)函數(shù)引用了嵌套的外部(父)函數(shù)的變量(函數(shù))時(shí), 就產(chǎn)生了閉包

閉包是什么?

  • 通過chrome工具調(diào)試查看得知: 閉包本質(zhì)是內(nèi)部函數(shù)中的一個(gè)對(duì)象, 這個(gè)對(duì)象中包含引用的變量屬性
  • 理解一: 閉包是嵌套的內(nèi)部函數(shù)(絕大部分人)
  • 理解二: 包含被引用變量(函數(shù))的對(duì)象(極少數(shù)人)
  • 注意: 閉包存在于嵌套的內(nèi)部函數(shù)中

產(chǎn)生閉包的條件?

  • 函數(shù)嵌套
  • 內(nèi)部函數(shù)引用了外部函數(shù)的數(shù)據(jù)(變量/函數(shù))

常見的閉包

  1. 將函數(shù)作為另一個(gè)函數(shù)的返回值
function fn1() {
  var a = 2;
  function fn2() {
    a++;
    console.log(a);
  }
  return fn2;
}
var f = fn1();
f();
f();
  1. 將函數(shù)作為實(shí)參傳遞給另一個(gè)函數(shù)調(diào)用
function showDelay(msg, time) {
    setTimeout(function () {
      alert(msg)
    }, time)
  }
  showDelay('atguigu', 2000)

閉包的作用

  1. 使用函數(shù)內(nèi)部的變量在函數(shù)執(zhí)行完后, 仍然存活在內(nèi)存中(延長了局部變量的生命周期)
  2. 讓函數(shù)外部能操作內(nèi)部的局部變量

閉包的生命周期

  1. 產(chǎn)生: 在嵌套內(nèi)部函數(shù)定義執(zhí)行完時(shí)就產(chǎn)生了(不是在調(diào)用)
  2. 死亡: 在嵌套的內(nèi)部函數(shù)成為垃圾對(duì)象時(shí)

閉包的應(yīng)用 :

  1. 定義JS模塊
  • 具有特定功能的js文件
  • 將所有的數(shù)據(jù)和功能都封裝在一個(gè)函數(shù)內(nèi)部(私有的)
  • 只向外暴露一個(gè)包信n個(gè)方法的對(duì)象或函數(shù)
  • 模塊的使用者, 只需要通過模塊暴露的對(duì)象調(diào)用方法來實(shí)現(xiàn)對(duì)應(yīng)的功能
  1. 循環(huán)遍歷加監(jiān)聽
  2. JS框架(jQuery)大量使用了閉包

閉包缺點(diǎn)

  1. 函數(shù)執(zhí)行完后, 函數(shù)內(nèi)的局部變量沒有釋放, 占用內(nèi)存時(shí)間會(huì)變長诬烹,容易造成內(nèi)存泄露
    解決:
    • 能不用閉包就不用
    • 及時(shí)釋放 : f = null; //讓內(nèi)部函數(shù)對(duì)象成為垃圾對(duì)象
  2. 閉包會(huì)在父函數(shù)外部可免,改變父函數(shù)內(nèi)部變量的值况芒。
    多個(gè)子函數(shù)的[[scope]]都是同時(shí)指向父級(jí),是完全共享的绷跑。因此當(dāng)父級(jí)的變量對(duì)象被修改時(shí)履怯,所有子函數(shù)都受到影響步咪。
    解決:
    • 變量可以通過 函數(shù)參數(shù)的形式 傳入,避免使用默認(rèn)的[[scope]]向上查找
    • 使用setTimeout包裹殖演,通過第三個(gè)參數(shù)傳入
    • 使用 塊級(jí)作用域,讓變量成為自己上下文的屬性年鸳,避免共享

內(nèi)存溢出與內(nèi)存泄露

  1. 內(nèi)存溢出
  • 一種程序運(yùn)行出現(xiàn)的錯(cuò)誤
  • 當(dāng)程序運(yùn)行需要的內(nèi)存超過了剩余的內(nèi)存時(shí), 就出拋出內(nèi)存溢出的錯(cuò)誤
  1. 內(nèi)存泄露
  • 占用的內(nèi)存沒有及時(shí)釋放
  • 內(nèi)存泄露積累多了就容易導(dǎo)致內(nèi)存溢出
  • 常見的內(nèi)存泄露:
    • 意外的全局變量
    • 沒有及時(shí)清理的計(jì)時(shí)器或回調(diào)函數(shù)
    • 閉包
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趴久,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搔确,更是在濱河造成了極大的恐慌彼棍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳算,死亡現(xiàn)場離奇詭異座硕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涕蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門华匾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宇葱,你說我怎么就攤上這事瘦真。” “怎么了黍瞧?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵诸尽,是天一觀的道長。 經(jīng)常有香客問我印颤,道長您机,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任年局,我火速辦了婚禮际看,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矢否。我一直安慰自己仲闽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布僵朗。 她就那樣靜靜地躺著赖欣,像睡著了一般屑彻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顶吮,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天社牲,我揣著相機(jī)與錄音,去河邊找鬼悴了。 笑死搏恤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的湃交。 我是一名探鬼主播熟空,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巡揍!你這毒婦竟也來了痛阻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤腮敌,失蹤者是張志新(化名)和其女友劉穎阱当,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糜工,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弊添,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捌木。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片油坝。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刨裆,靈堂內(nèi)的尸體忽然破棺而出澈圈,到底是詐尸還是另有隱情,我是刑警寧澤帆啃,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布瞬女,位于F島的核電站,受9級(jí)特大地震影響努潘,放射性物質(zhì)發(fā)生泄漏诽偷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一疯坤、第九天 我趴在偏房一處隱蔽的房頂上張望报慕。 院中可真熱鬧,春花似錦压怠、人聲如沸眠冈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜗顽。三九已至玄柠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诫舅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工宫患, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刊懈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓娃闲,卻偏偏與公主長得像虚汛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子皇帮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 閉包: 官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù))卷哩,因而這些變量也是該...
    小裁縫sun閱讀 618評(píng)論 0 5
  • 閉包(closure)是Javascript語言的一個(gè)難點(diǎn),也是它的特色属拾,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)将谊。 一、變量...
    風(fēng)蕭蕭易水寒_1196閱讀 258評(píng)論 0 0
  • 閉包(closure)是Javascript語言的一個(gè)難點(diǎn)渐白,也是它的特色尊浓,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一纯衍、變量...
    zouCode閱讀 1,271評(píng)論 0 13
  • 作用域和閉包是 JavaScript 最重要的概念之一栋齿,想要進(jìn)一步學(xué)習(xí) JavaScript,就必須理解 Java...
    劼哥stone閱讀 1,177評(píng)論 1 13
  • 姓名:韓榮茹 部門:業(yè)務(wù)部 職位:業(yè)務(wù)員 【知~學(xué)習(xí)】 【內(nèi)容感悟分享】要謙虛襟诸,不要驕傲 【行~實(shí)踐】 一瓦堵、修身:...
    小太陽_6c57閱讀 104評(píng)論 0 0