第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaScript內(nèi)存管理

JavaScript內(nèi)存管理

? ? ? ? JavaScript內(nèi)存管理? ? ? ? ? ? ?? 低級語言,比如C,有低級的內(nèi)存管理基元,想malloc(),free()。另一方面,JavaScript的內(nèi)存基元在變量(對象,字符串等等)創(chuàng)建時分配,然后在他們不再被使用時“自動”釋放。后者被稱為垃圾回收。這個“自動”是混淆并給JavaScript(和其他高級語言)開發(fā)者一個錯覺:他們可以不用考慮內(nèi)存管理。內(nèi)存生命周期不管什么程序語言,內(nèi)存生命周期基本一致:分配你所需要的內(nèi)存使用它(讀、寫)當它不被使用時釋放? ?ps:和“把大象裝冰箱“一個意思第一二部分過程在所有語言中都很清晰。最后一步在低級語言中很清晰,但是在像JavaScript等高級語言中,最后一步不清晰。JavaScript的內(nèi)存分配變量初始化為了不讓程序員為分配費心,JavaScript在定義變量時完成內(nèi)存分配。var?n?=?123;?//?給數(shù)值變量分配內(nèi)存 var?s?=?"azerty";?//?給字符型? var?o?=?{ ??a:?1, ??b:?null };?//?為對象及其包含變量分配內(nèi)存 var?a?=?[1,?null,?"abra"];?//?為數(shù)組及其包含變量分配內(nèi)存(就像對象) function?f(a){ ??return?a?+?2; }?//?為函數(shù)(可調用的對象)分配內(nèi)存 //?函數(shù)表達式也能分配一個對象 someElement.addEventListener('click',?function(){ ??someElement.style.backgroundColor?=?'blue'; },?false);通過函數(shù)調用的內(nèi)存分配有些函數(shù)調用結果是分配對象內(nèi)存:var?d?=?new?Date(); var?e?=?document.createElement('div');?//分配一個DOM元素有些方法分配新變量或者新對象:var?s?=?"azerty"; var?s2?=?s.substr(0,?3);?//?s2?is?a?new?string //因為string是不變量,JavaScript可能沒有分配內(nèi)存,但只是存儲了0-3的范圍。 var?a?=?["ouais?ouais",?"nan?nan"]; var?a2?=?["generation",?"nan?nan"]; var?a3?=?a.concat(a2);?//?新數(shù)組中有連接數(shù)組a和數(shù)組a2中的四個元素。值的使用使用值的過程實際上是對分配內(nèi)存進行讀取與寫入的操作,這意味著可以寫入一個變量或者一個對象的屬性值,甚至傳遞函數(shù)的參數(shù)。當內(nèi)存不再需要使用時釋放大多數(shù)內(nèi)存管理的問題都在這個階段。在這里最艱難的任務是找到“所分配的內(nèi)存確實已經(jīng)不再需要了”。它往往要求開發(fā)人員來確定在程序中哪一塊內(nèi)存不再需要并且釋放它。高級語言解釋器嵌入了“垃圾回收器”,主要工作是跟蹤內(nèi)存的分配和使用,以便當分配的內(nèi)存不再使用時,自動釋放它。這個過程是一個近似的,因為要知道某塊內(nèi)存是否需要是無法判定的 (無法被某種算法所解決)。垃圾回收如上文所述自動尋找是否一些內(nèi)存“不再需要”的問題是無法判定的。因此,垃圾回收實現(xiàn)只能有限制的解決一般問題。本節(jié)將解釋必要的概念,了解主要的垃圾回收算法和它們的局限性。引用垃圾回收算法主要依賴于引用的概念。在內(nèi)存管理的環(huán)境中,一個對象如果有訪問另一個對象的權限(隱式或者顯式),叫做一個對象引用另一個對象。例如,一個Javascript對象具有對它 原型 的引用(隱式引用)和對它屬性的引用(顯式引用)。在這里,“對象”的概念不僅特制Javascript對象,還包括函數(shù)作用域(或者全局詞法作用域)。引用計數(shù)垃圾收集這是最簡單的垃圾收集算法。此算法把“對象是否不再需要”簡化定義為“對象有沒有其他對象引用到它”。如果沒有引用指向該對象(零引用),對象將被垃圾回收機制回收。例如var?o?=?{? ??a:?{ ????b:2 ??} };? //?兩個對象被創(chuàng)建,一個做為另一個的屬性被引用,另一個被分配給變量o //?很顯然,沒有一個可以被垃圾收集 var?o2?=?o;?//?o2變量是第二個對“這個對象”的引用 o?=?1;?//?現(xiàn)在,“這個對象”的原始引用o被o2替換了 var?oa?=?o2.a;?//?引用“這個對象”的a屬性 //?現(xiàn)在,“這個對象”有兩個引用了,一個是o2,一個是oa o2?=?"yo";?//?最初的對象現(xiàn)在已經(jīng)是零引用了 //?他可以被垃圾回收了 //?然而它的屬性a的對象還在被oa引用,所以還不能回收 oa?=?null;?//?a屬性的那個對象現(xiàn)在也是零引用了 //?它可以被垃圾回收了限制:循環(huán)引用這個簡單的算法有一個限制,就是如果一個對象引用另一個(形成了循環(huán)引用),他們可能“不再需要”了,但是他們不會被回收。function?f(){ ??var?o?=?{}; ??var?o2?=?{}; ??o.a?=?o2;?//?o?引用?o2 ??o2.a?=?o;?//?o2?引用?o ??return?"azerty"; } f(); //?兩個對象被創(chuàng)建,并互相引用,形成了一個循環(huán) //?他們被調用之后不會離開函數(shù)作用域 //?所以他們已經(jīng)沒有用了,可以被回收了 //?然而,引用計數(shù)算法考慮到他們互相都有至少一次引用,所以他們不會被回收實際當中的例子IE 6, 7 對DOM對象進行引用計數(shù)回收。對他們來說,一個常見問題就是內(nèi)存泄露:var?div?=?document.createElement("div"); div.onclick?=?function(){ ??doSomething(); };? //?div有了一個引用指向事件處理屬性onclick //?事件處理也有一個對div的引用可以在函數(shù)作用域中被訪問到 //?這個循環(huán)引用會導致兩個對象都不會被垃圾回收標記-清除算法這個算法把“對象是否不再需要”簡化定義為“對象是否可以獲得”。這個算法假定設置一個叫做根的對象(在Javascript里,根是全局對象)。定期的,垃圾回收器將從根開始,找所有從根開始引用的對象,然后找這些對象引用的對象……從根開始,垃圾回收器將找到所有可以獲得的對象和所有不能獲得的對象。這個算法比前一個要好,因為“有零引用的對象”總是不可獲得的,但是相反卻不一定,參考“循環(huán)引用”。從2012年起,所有現(xiàn)代瀏覽器都使用了標記-清除垃圾回收算法。所有對JavaScript垃圾回收算法的改進都是基于標記-清除算法的改進,并沒有改進標記-清除算法本身和它對“對象是否不再需要”的簡化定義。循環(huán)引用不再是問題了在上面的示例中,函數(shù)調用返回之后,兩個對象從全局對象出發(fā)無法獲取。因此,他們將會被垃圾回收器回收。第二個示例同樣,一旦 div 和其事件處理無法從根獲取到,他們將會被垃圾回收器回收。限制: 對象需要明確的不可獲得盡管這是一個限制,但是很少會被突破,這也就是為什么在現(xiàn)實中很少人會去關心垃圾回收機制。原文來自:w3cfuns.com
查看完整描述

目前暫無任何回答

  • 0 回答
  • 5 關注
  • 2539 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號