亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

三個(gè)閉包實(shí)例理解閉包對(duì)內(nèi)存的影響

jackzou / 2070人閱讀

摘要:在試圖弄清這個(gè)問題之前,先要理解棧內(nèi)存堆內(nèi)存和預(yù)處理。因此在子函數(shù)執(zhí)行的時(shí)候,堆內(nèi)存被占用了,相應(yīng)的棧內(nèi)存也將保留。所以,棧內(nèi)存在執(zhí)行完之后會(huì)被保留一段時(shí)間,這段時(shí)間等于其子函數(shù)執(zhí)行的時(shí)間。

在試圖弄清這個(gè)問題之前,先要理解棧內(nèi)存、堆內(nèi)存和預(yù)處理。

占用內(nèi)存,不會(huì)銷毀的閉包實(shí)例 例1:
var num = 12;
function fn() {
    var num = 100;
    return function () {
        console.log(num);
    }
}
var f = fn();
f();

例1的圖示

未被占用的堆內(nèi)存才會(huì)被銷毀

所以,正如圖中橢圓形關(guān)鍵點(diǎn)中說明的那樣,堆內(nèi)存xxxfff111被返回給了全局變量f,而全局變量只有在窗口關(guān)閉的時(shí)候才會(huì)銷毀,因此堆內(nèi)存xxxfff111將一直被占用而不會(huì)銷毀,定義它的局部作用域A也不會(huì)被銷毀。

例2
var oDiv = document.getElementById("div1");
~function() {
    oDiv.onclick = function() {

    }
}();

這段代碼的特點(diǎn)是:私有作用域給DOM元素的事件綁定一個(gè)方法。

例2的圖示:

正如圖中橢圓形關(guān)鍵點(diǎn)所說,標(biāo)簽對(duì)象的屬性里面會(huì)自帶一個(gè)onclick的屬性,未被賦值時(shí)其值為null。那么,在自執(zhí)行函數(shù)執(zhí)行的時(shí)候,其創(chuàng)建的作用域所占用的堆內(nèi)存xxxfff111同樣也會(huì)被全局的堆內(nèi)存xxxfff000占用(這里要注意,是堆內(nèi)存占用堆內(nèi)存),所以堆內(nèi)存xxxfff111和棧內(nèi)存A都不會(huì)被銷毀。

不占用內(nèi)存,立即銷毀的實(shí)例

只需要將例1稍作修改。

例3:
function fn(){
    var num = 100;
    return function(){
        console.log(num);
    }
}
fn();    //主要修改在這里

例3的圖示

由于在函數(shù)fn中,xxxfff111是被return的,所以棧內(nèi)存A的預(yù)解釋不會(huì)處理xxxfff111,它只在fn函數(shù)執(zhí)行的時(shí)候才會(huì)生成,而函數(shù)fn的棧內(nèi)存A每次被執(zhí)行之后都會(huì)被銷毀。

暫時(shí)占用內(nèi)存,延時(shí)銷毀的閉包實(shí)例

將例3稍作修改,就變成了延時(shí)銷毀的閉包實(shí)例。

例4:
function fn(){
  var num = 100;
  return function(){

  }
}
fn()();    //這里到底發(fā)生了什么?其實(shí)是執(zhí)行了一次fn之后,把返回的子函數(shù)有執(zhí)行了一次,所以在子函數(shù)執(zhí)行的時(shí)候,棧內(nèi)存fn()是不能銷毀的,但是子函數(shù)執(zhí)行完畢后因?yàn)闆]有被占用,所以最終fn()還是會(huì)被銷毀的。

例4的圖示:

正如圖中橢圓形關(guān)鍵點(diǎn)處所說,fn()()的意思是在執(zhí)行完fn()之后再把返回的值函數(shù)執(zhí)行一遍。因此在子函數(shù)執(zhí)行的時(shí)候,堆內(nèi)存xxxfff111被占用了,相應(yīng)的棧內(nèi)存A也將保留。

可堆內(nèi)存xxxfff111中保存的子函數(shù)在執(zhí)行完成之后還是會(huì)被銷毀,接著堆內(nèi)存xxxfff111就作為未被占用的堆內(nèi)存而被銷毀,最終棧內(nèi)存A也會(huì)被銷毀。

所以,棧內(nèi)存在執(zhí)行完之后會(huì)被保留一段時(shí)間,這段時(shí)間等于其子函數(shù)執(zhí)行的時(shí)間。

參考資料:

JavaScript高級(jí)程序設(shè)計(jì)(第三版)。

我在github
https://github.com/zhuanyongx...

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/107411.html

相關(guān)文章

  • JS中對(duì)內(nèi)存的一些了解

    摘要:中對(duì)內(nèi)存的一些了解在進(jìn)行開發(fā)的過程中了解內(nèi)存機(jī)制有助于開發(fā)人員能夠清晰的認(rèn)識(shí)到自己寫的代碼在執(zhí)行的過程中發(fā)生過什么也能夠提高項(xiàng)目的代碼質(zhì)量?jī)?nèi)存是怎么樣的中變量存放有著原始值與引用值之分原始值原始的數(shù)據(jù)類型以及新加入的引用值等類型的值便是引用 JS中對(duì)內(nèi)存的一些了解 在JS進(jìn)行開發(fā)的過程中, 了解JS內(nèi)存機(jī)制有助于開發(fā)人員能夠清晰的認(rèn)識(shí)到自己寫的代碼在執(zhí)行的過程中發(fā)生過什么, 也能夠提高...

    elliott_hu 評(píng)論0 收藏0
  • 深入理解JavaScript(二):由一道題來思考閉包

    摘要:中所有的事件綁定都是異步編程當(dāng)前這件事件沒有徹底完成,不再等待,繼續(xù)執(zhí)行下面的任務(wù)當(dāng)綁定事件后,不需要等待執(zhí)行,繼續(xù)執(zhí)行下一個(gè)循環(huán)任務(wù),所以當(dāng)我們點(diǎn)擊執(zhí)行方法的時(shí)候,循環(huán)早已結(jié)束即是最后。 概念 閉包就是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù) 點(diǎn)擊li標(biāo)簽彈出對(duì)應(yīng)數(shù)字 0 1...

    曹金海 評(píng)論0 收藏0
  • 一年內(nèi)經(jīng)驗(yàn)前端面試題記錄

    摘要:對(duì)于,其默認(rèn)大小一般是本地存儲(chǔ)和都保存在瀏覽器端,且都是同源的。把變量放在閉包中和放在全局作用域,對(duì)內(nèi)存的影響是一致的,這里并不能說成是內(nèi)存泄露。將新的樹和之前的虛擬樹進(jìn)行相比較,根據(jù)結(jié)果對(duì)進(jìn)行精準(zhǔn)響應(yīng)。 1. JavaScript 1. JavaScript文件在什么情況下會(huì)放在html哪個(gè)位置 https://zhuanlan.zhihu.com/p/... 對(duì)于必須要在DOM加載...

    qianfeng 評(píng)論0 收藏0
  • 一年內(nèi)經(jīng)驗(yàn)前端面試題記錄

    摘要:對(duì)于,其默認(rèn)大小一般是本地存儲(chǔ)和都保存在瀏覽器端,且都是同源的。把變量放在閉包中和放在全局作用域,對(duì)內(nèi)存的影響是一致的,這里并不能說成是內(nèi)存泄露。將新的樹和之前的虛擬樹進(jìn)行相比較,根據(jù)結(jié)果對(duì)進(jìn)行精準(zhǔn)響應(yīng)。 1. JavaScript 1. JavaScript文件在什么情況下會(huì)放在html哪個(gè)位置 https://zhuanlan.zhihu.com/p/... 對(duì)于必須要在DOM加載...

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

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

0條評(píng)論

jackzou

|高級(jí)講師

TA的文章

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