成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

理解閉包

fox_soyoung / 1295人閱讀

摘要:我的理解就是還處于被引用狀態(tài)。內(nèi)存機(jī)制的內(nèi)存空間分為棧堆其中棧存放變量,堆存放復(fù)雜對(duì)象。對(duì)堆內(nèi)數(shù)據(jù)進(jìn)行復(fù)制修改時(shí)理解閉包有了前面的鋪墊,我們?cè)賮砜纯撮]包是怎么回事。這種反常的現(xiàn)象我們就叫它,中文名閉包。這就是閉包形成的原因了。

知識(shí)小儲(chǔ)備
ECMAScript 的數(shù)據(jù)有兩種類型:基本類型值和引用類型值,基本類型指的是簡單的數(shù)據(jù)段,引用類型指的是可能由多個(gè)值構(gòu)成的對(duì)象。

Undefined、Null、Boolean、Number 和 String 是值類型,其他都是引用類型。

垃圾回收

我們創(chuàng)建的原始類型、對(duì)象、函數(shù)等等,都會(huì)占用內(nèi)存。為了防止溢出,我們就需要對(duì)不用的數(shù)據(jù)進(jìn)行刪除。這就是垃圾回收。

可觸及(Reachability)

JavaScript 內(nèi)存管理的關(guān)鍵概念是可觸及(Reachability)。
我的理解就是還處于被引用狀態(tài)。
將全局(無論是window還是global)比作樹根,我們創(chuàng)建的原始類型、對(duì)象、函數(shù)等等比作一個(gè)個(gè)枝杈。如果可以從window不斷層的知道某個(gè)變量,那這個(gè)變量就是可觸及的,不可回收的。

舉個(gè)例子:

// user has a reference to the object
let user = {
  name: "John"
};

箭頭代表的是對(duì)象引用。全局變量 "user" 引用了對(duì)象{name: "John"}(簡稱此對(duì)象為 John)。John 的 "name" 屬性儲(chǔ)存的是一個(gè)原始值,所以無其他引用。

如果覆蓋 user,對(duì) John 的引用就丟失了:

user = null;

現(xiàn)在 John 變得不可觸及,垃圾回收機(jī)制會(huì)將其刪除并釋放內(nèi)存。

內(nèi)存機(jī)制

js的內(nèi)存空間分為棧 (stack)、堆 (heap);其中棧存放變量,堆存放復(fù)雜對(duì)象。
借用一張圖直觀感受一下

棧內(nèi)存

只能存放基本數(shù)據(jù)類型的數(shù)據(jù)和對(duì)象類型的引用地址也叫哈希碼。里面的數(shù)據(jù)后進(jìn)先出。
對(duì)棧內(nèi)數(shù)據(jù)進(jìn)行復(fù)制修改時(shí):

堆內(nèi)存

是用來存儲(chǔ) “數(shù)組類型” 和“對(duì)象類”的數(shù)據(jù)。特點(diǎn)是存儲(chǔ)空間大。
對(duì)堆內(nèi)數(shù)據(jù)進(jìn)行復(fù)制修改時(shí):

理解閉包

有了前面的鋪墊,我們?cè)賮砜纯撮]包是怎么回事。還是舉個(gè)例子:

//決策層開會(huì)決定生產(chǎn)新一代phone手機(jī),就弄了個(gè)叫PhoneFactory的企劃案
let Proposal = function(){
    //新一代手機(jī)信息被封裝在企劃案中
    let  version = "XX", money = 10000
    return function (){
        //生產(chǎn)新的手機(jī)
        return {
            version: version,
            money: money
        }
    }
}
//執(zhí)行者根據(jù)策劃案建成了一個(gè)工廠, 工廠方法每執(zhí)行一次就產(chǎn)出一個(gè)手機(jī)
let Factory = new Proposal();
let phone1 = Factory();
console.log(phone1.version)

對(duì)于手機(jī)的version, money而言, 它是策劃書Proposal的內(nèi)部變量,而Proposal的同級(jí)phone1應(yīng)該是訪問不到。但實(shí)際上我們還是拿到了手機(jī)的版本和價(jià)格數(shù)據(jù)。這種反常的現(xiàn)象我們就叫它Closure,中文名閉包。

原因

我們不管它為什么叫這個(gè)名字,先看看具體是什么原因產(chǎn)生的。
根據(jù)上面說的垃圾回收機(jī)制。函數(shù)Proposal在執(zhí)行過之后(第16行)就沒有引用。那么Proposal久應(yīng)該被回收。里面的所有內(nèi)部變量也應(yīng)該被回收了。
但實(shí)際上 Proposal返回了一個(gè)新的函數(shù)Factory。而這個(gè)Factory是要能夠訪問到它生成時(shí)的同級(jí)以及父祖輩變量。而Proposal內(nèi)部變量version, money就有了新的引用。因而阻止了被回收。就像Factory生成了一個(gè)新的泡泡把它能訪問到的作用域包裹了起來。這就是閉包形成的原因了。

基于上面的js內(nèi)存機(jī)制的知識(shí),我們可以畫出下面這張圖:

圖簡陋了點(diǎn)。。。。
但也可以看出,對(duì)于變量version,money而言。雖然他們本身在proposal的黃色作用域中。但也在fatory生成的時(shí)候也被包含在了fatory打的可訪問的作用域氣泡內(nèi)。不僅他們,甚至更外層的也都被包含在內(nèi)。
在proposal這個(gè)泡泡破碎之后,只有當(dāng)打的紅色泡泡也破了,這些變量才會(huì)真的被回收。這也是為什么閉包用多了會(huì)影響性能的原因。

引用:

前端基礎(chǔ)進(jìn)階:詳細(xì)圖解 JavaScript 內(nèi)存空間
垃圾回收

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/96310.html

相關(guān)文章

  • 多層級(jí)理解閉包

    摘要:第二梯隊(duì)理解有了第一梯隊(duì)的認(rèn)識(shí),我們慢慢修正大腦中對(duì)閉包的認(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 閉包

    摘要:如何在初學(xué)就理解閉包你需要接著讀下去。這樣定義閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。小結(jié)閉包在中隨處可見。閉包是中的精華部分,理解它需要具備一定的作用域執(zhí)行棧的知識(shí)。 這是本系列的第 4 篇文章。 作為 JS 初學(xué)者,第一次接觸閉包的概念是因?yàn)閷懗隽祟愃葡旅娴拇a: for (var i = 0; i < helpText.length; i++) { var item = he...

    寵來也 評(píng)論0 收藏0
  • 談?wù)勎宜?em>理解的閉包,js、php、golang里的closure

    摘要:當(dāng)初看這個(gè)解釋有點(diǎn)懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學(xué)習(xí)語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當(dāng)時(shí)網(wǎng)上很多人說閉包是難點(diǎn),各種地方對(duì)閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...

    betacat 評(píng)論0 收藏0
  • 談?wù)勎宜?em>理解的閉包,js、php、golang里的closure

    摘要:當(dāng)初看這個(gè)解釋有點(diǎn)懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學(xué)習(xí)語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當(dāng)時(shí)網(wǎng)上很多人說閉包是難點(diǎn),各種地方對(duì)閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...

    zhoutao 評(píng)論0 收藏0
  • 簡單理解JavaScript中的閉包

    摘要:閉包在我理解是一種比較抽象的東西。所以我寫了一篇博文來方便自己理解閉包。那么現(xiàn)在我們可以解釋一下閉包的第一個(gè)定義在計(jì)算機(jī)科學(xué)中,閉包是引用了自由變量的函數(shù)。循環(huán)中創(chuàng)建閉包在我們使用的關(guān)鍵字之前,閉包的一個(gè)常見問題就出現(xiàn)在循環(huán)中創(chuàng)建閉包。 零. 前言 從我開始接觸前端時(shí)就聽說過閉包,但是一直不理解閉包究竟是什么。上網(wǎng)看了各種博客,大家對(duì)閉包的說法不一。閉包在我理解是一種比較抽象的東西。所...

    sihai 評(píng)論0 收藏0
  • 理解Javascript的閉包

    摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在??上У氖?,并沒有提供相關(guān)的成員和方法來訪問閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門文章。Javascript中有幾個(gè)非常重要的語言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個(gè)新的語言特性。本文將...

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

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

0條評(píng)論

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