成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

閉包,又見閉包。。。。?

keelii / 566人閱讀

摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數(shù)作用域達(dá)到了訪問外層變量的目的。此時(shí)一個(gè)完整的閉包實(shí)現(xiàn)了,的垃圾回收機(jī)制由于閉包的存在無法銷毀變量。

1.閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。

上面這段話來自 javascript 高級(jí)程序設(shè)計(jì) 第三版 P178 。作者說閉包是一個(gè)函數(shù),它有訪問另一個(gè)函數(shù)作用域中的變量的能力。

2.函數(shù)訪問它被創(chuàng)建時(shí)所處的上下文環(huán)境。這被稱為閉包。

這段話來自 javascript 語言精粹 修訂版 P38 。作者沒有定義閉包為何物,只是說函數(shù)訪問它被創(chuàng)建時(shí)的上下文環(huán)境,這種xxx(行為?過程?能力?) 被稱為閉包。

3.1閉包是依賴于詞法作用域編寫代碼而產(chǎn)生的結(jié)果

3.2閉包就是函數(shù)能夠記住并訪問它的詞法作用域,即使當(dāng)這個(gè)函數(shù)在它的詞法作用域之外執(zhí)行時(shí)

這兩段話來自 You-Dont-Know-JS 作用域閉包 這一章,作者說閉包是一種結(jié)果。

閉包的一般定義

閉包是一種抽象概念,每個(gè)人對其理解不同,所以有了上面的幾種解釋。但大家討論的確是同一個(gè)問題。

//step 1
function outer() {
  var a = "hello world";
  function inner() {
    return a ;
  }
  return inner();
}
// hello world
outer();

我們發(fā)現(xiàn)位于 outer 函數(shù)內(nèi)的 inner 函數(shù)可以訪問到另一個(gè)函數(shù) outer 的作用域中的變量 a 。完美的閉包,對,閉包就這么簡單。哈哈哈哈哈,本文結(jié)束?。?!

閉包的由來

其實(shí)上面那段代碼并不是大家真正所說的閉包,它其實(shí)是利用了函數(shù)作用域的特點(diǎn) -- 內(nèi)層函數(shù)可以訪問外層變量。這僅僅是閉包的一部分,閉包利用函數(shù)作用域達(dá)到了訪問外層變量 a 的目的。

依據(jù)定義 1,閉包可以說在代碼 step1 中已經(jīng)產(chǎn)生了。
我們接下來看 step2:

//step 2
function outer() {
  a = "hello world";
  function inner() {
      return a;
    }
  return inner();
}

var c = outer();
// hello world
c;

這次我們執(zhí)行 outer 函數(shù), outer() 是一個(gè)函數(shù)對象,在內(nèi)部只會(huì)返回 inner 函數(shù)的結(jié)果 a ,因?yàn)?inner 函數(shù)的存在,每次執(zhí)行 inner 便會(huì)對變量 a 進(jìn)行引用,這會(huì)導(dǎo)致變量 a 的引用計(jì)數(shù)為 1 ,從而垃圾回收機(jī)制無法銷毀變量 a。我們便在函數(shù)執(zhí)行完畢后依然訪問到了變量 a。正規(guī)的寫法如 step3:

//step3
var c = (function() {
  var a = "hello world";
  return {
    inner : function() {
      return a;
    }
  }
})();

// hello world
c.inner();

我們利用自執(zhí)行匿名函數(shù)把 inner 函數(shù)保存到對象 c 上,這時(shí) c.inner 就是 inner 函數(shù),它可以訪問到 inner 函數(shù)之外的變量 a 。變量 c.inner 引用了變量 a 的值,導(dǎo)致變量 a 在函數(shù)執(zhí)行后依然無法被銷毀 。此時(shí)一個(gè)完整的閉包實(shí)現(xiàn)了, js 的垃圾回收機(jī)制由于閉包的存在無法銷毀變量 a。我們利用閉包,在函數(shù)外層還是訪問到了 a ,保存了函數(shù)內(nèi)部的細(xì)節(jié)。這就是閉包的全部。由此得來下面定義:

4.閉包是阻止垃圾回收機(jī)制在內(nèi)存中銷毀變量的方法,使得在創(chuàng)建變量的執(zhí)行環(huán)境外可以訪問到該變量

上面這段話來自 單頁Web應(yīng)用 JavaScript 從前端到后端 P49,個(gè)人認(rèn)為這本書也是對閉包解釋最為詳盡生動(dòng)的一本書。因?yàn)榇藭写罅渴褂昧四K模式所以對閉包的解釋十分詳盡。

總結(jié)一下:閉包是由函數(shù)產(chǎn)生的「函數(shù)可以創(chuàng)建新的作用域」,當(dāng)我們把它賦值給一個(gè)變量后,一個(gè)完整的閉包出現(xiàn)了。它阻止了 js 的垃圾回收機(jī)制對函數(shù)內(nèi)部變量的回收,導(dǎo)致函數(shù)內(nèi)部變量的引用計(jì)數(shù)一直不為 0,無法被垃圾收集器回收。所以我們常聽亂用閉包可能導(dǎo)致內(nèi)存泄漏,就是因?yàn)殚]包的這個(gè)特點(diǎn)。

函數(shù)作用域的特性讓我們可以從函數(shù)內(nèi)部取得函數(shù)外部的變量,而閉包提供了一種反向的操作可能 -- 我們在函數(shù)的外部也可以取得函數(shù)內(nèi)部的變量

閉包是函數(shù)外可以訪問函數(shù)內(nèi)變量的實(shí)現(xiàn)

其它:
StackOverflow 閉包是什么
閉包的用處:You-Dont-Know-JS

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81109.html

相關(guān)文章

  • JS 中的閉包是什么?

    摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么??吹介]包在哪了嗎閉包到底是什么五年前,我也被這個(gè)問題困擾,于是去搜了并總結(jié)下來。關(guān)于閉包的謠言閉包會(huì)造成內(nèi)存泄露錯(cuò)。閉包里面的變量明明就是我們需要的變量,憑什么說是內(nèi)存泄露這個(gè)謠言是如何來的因?yàn)椤? 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學(xué)習(xí)指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...

    Enlightenment 評(píng)論0 收藏0
  • 多層級(jí)理解閉包

    摘要:第二梯隊(duì)理解有了第一梯隊(duì)的認(rèn)識(shí),我們慢慢修正大腦中對閉包的認(rèn)識(shí)。理解這句話就可以很好的與閉包這兩個(gè)字關(guān)聯(lián)起來理解閉包這個(gè)概念了??偨Y(jié)第二梯隊(duì)理解閉包是一個(gè)有特定功能的函數(shù)。第四梯隊(duì)理解閉包通過訪問外部變量,一個(gè)閉包可以維持這些變量。 閉包 閉包的概念困惑了我很久,記得當(dāng)時(shí)我面試的時(shí)候最后一面有一個(gè)問題就是問題關(guān)于閉包的問題,然而到現(xiàn)在已經(jīng)完全不記得當(dāng)時(shí)的題目是啥了,但仍然能夠回憶起當(dāng)時(shí)...

    nemo 評(píng)論0 收藏0
  • 面試官問我:什么是JavaScript閉包,我該如何回答

    摘要:到底什么是閉包這個(gè)問題在面試是時(shí)候經(jīng)常都會(huì)被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項(xiàng)通常,函數(shù)的作用域及其所有變量都會(huì)在函數(shù)執(zhí)行結(jié)束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設(shè)計(jì)理念,有人說所有的函數(shù)都是閉包。到底什么是閉包?這個(gè)問題在面試是時(shí)候經(jīng)常都會(huì)被問,很多小白一聽就懵逼了,不知道如何回答好。這個(gè)...

    BenCHou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<