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

資訊專欄INFORMATION COLUMN

值類型、執(zhí)行環(huán)境和垃圾回收

darkbaby123 / 2675人閱讀

摘要:中的變量是松散類型的即它在不同的時期可以有不同類型的值這也是最強(qiáng)大的的特性之一基本類型和引用類型的值的值類型有兩種基本類型引用類型。

ECMAscript中的變量是松散類型的,即它在不同的時期可以有不同類型的值,這也是ECMAscript最強(qiáng)大的的特性之一.

基本類型和引用類型的值

javascript的值類型有兩種:基本類型 引用類型?;绢愋偷闹凳侵傅暮唵蔚臄?shù)據(jù)段,基本類型有五種,依次是:Undefined Boolean String Number Null,而引用類型的值指的是由多個值構(gòu)成的對象.

基本類型值和引用類型值的區(qū)別 保存方式不同

基本類型值的變量是保存確實(shí)的值.而引用類型值的變量保存的是一個指針,這個指針指向內(nèi)存中的對象.

引用類型的值可以動態(tài)添加屬性和方法. 復(fù)制形式不同

當(dāng)基本類型值的變量被復(fù)制給另一個變量時,內(nèi)存中會新開辟一個存儲空間來存儲這個新變量的值,新變量的值和被復(fù)制的變量的值保存在兩個不同的存儲空間中,它們相互獨(dú)立,互不影響.

當(dāng)引用類型值的變量被復(fù)制給另一個變量時,內(nèi)存中不會開辟新的空間,新變量保存的也是一個指向內(nèi)存中對象的指針,新變量和舊變量指向的是同一個存儲區(qū)域,因此改變其中一個變量的值,另一個變量也會隨之改變.

var name = "yuhualingfeng";
var anotherName = name;
alert(anotherName);  // yuhualingfeng

anoherName = "Jake";
alert(anotherName); // Jake
alert(name); //yuhualingfeng 

如上所示,改變了anotherName的值并沒影響到name變量的值.

var obj = new Object();
obj.name = "yuhualingfeng";

var anotherObj = obj;

alert(anotherObj.name); // yuhualingfeng

anotherObj.name = "Jake";

alert(anotherObj.name); // Jake
alert(obj.name);  Jake

改變anotherObj對象的name屬性值后,obj對象的name屬性值也隨之改變,這一點(diǎn)可以判斷出二者指向的是同一個存儲區(qū)域.

執(zhí)行環(huán)境(作用域)

執(zhí)行環(huán)境是Javascript中最為重要的一個概念.執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),定義了它們各自的行為.每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象

全局執(zhí)行環(huán)境是最外層的執(zhí)行環(huán)境,全局執(zhí)行環(huán)境中有一個window全局對象,全局環(huán)境中的所有變量都可以通過window對象訪問.

除全局執(zhí)行環(huán)境外,每個函數(shù)也都有一個自己的執(zhí)行環(huán)境.當(dāng)執(zhí)行某個函數(shù)時,會產(chǎn)生一個由變量對象組成的作用域鏈,作用域鏈的存在是為了讓解析器能夠有序的找尋標(biāo)識符,假如在函數(shù)中使用某個變量時,首先解析器會在函數(shù)自身的變量對象中找尋這個變量的標(biāo)識符,假如沒找到,會繼續(xù)查找上一個變量對象,直到找到這個標(biāo)識符為止.查找標(biāo)識符時,
解析器會從作用域鏈中函數(shù)自身的變量對象開始尋找,直至全局執(zhí)行環(huán)境中的變量對象,假如在全局環(huán)境中的變量對象中沒找到標(biāo)識符,解析器就會拋出錯誤.

var age = 30;

function changeAge(){

age = 40;

}

changeAge();

alert(age); // 40

changeAge的作用域鏈中有兩個變量對象,自身的變量對象和全局環(huán)境的變量對象,當(dāng)執(zhí)行changeAge函數(shù)時,調(diào)用了age變量,解析器先在changeAge變量對象中查找此變量,沒有找到,然后繼續(xù)查找上一個變量對象全局變量對象,找到了age變量.

有一點(diǎn)要注意的是,javascript中的作用域和其他編程語言不同,它沒有塊級作用域,看下面的例子:

function test(){

      for(var i = 0,len =10;i < len;i++){
    doSomething(i);
    console.log(i); //  10
    }

}
test();

在for語句中定義的i變量,在for語句外可以被訪問到.javascript中定義的變量會把它添加到最近執(zhí)行環(huán)境的變量對象中.這里會把i變量添加到test函數(shù)的變量對象中.

垃圾收集

Javascript具有自動垃圾收集機(jī)制,執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存.

垃圾回收機(jī)制的原理:垃圾收集器找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存,垃圾收集器會按固定的事件周期性的執(zhí)行內(nèi)存回收.

用于標(biāo)記無用變量策略因?qū)崿F(xiàn)而異,具體到瀏覽器中的插件,通常有以下兩種策略:標(biāo)記清楚 引用計數(shù)

標(biāo)記清除

標(biāo)記清除是瀏覽器中最常用的一種垃圾收集方式.當(dāng)變量進(jìn)入環(huán)境時(例如用var 聲明一個變量),就將這個變量標(biāo)記為進(jìn)入環(huán)境,當(dāng)變量離開環(huán)境時,就將這個變量標(biāo)記為離開環(huán)境,當(dāng)然,做這種標(biāo)記的方式可以有多種,比如可以通過翻轉(zhuǎn)某個特殊的位來記錄變量合適進(jìn)入環(huán)境,或者使用一個"進(jìn)入環(huán)境的"變量列表及一個"離開環(huán)境的"變量列表來跟蹤哪個變量發(fā)生了變化.

垃圾回收器會給所有存儲在內(nèi)存中的變量都加上標(biāo)記(進(jìn)入環(huán)境),當(dāng)變量在執(zhí)行環(huán)境中無法被訪問到時,就會加上另一種標(biāo)記(離開環(huán)境),待下一次垃圾回收器進(jìn)行回收時將回收其占用的內(nèi)存.

引用計數(shù)

另一種不太常見的回收方式是引用計數(shù).引用計數(shù)就是計算出變量被引用的次數(shù),當(dāng)一個變量被賦值為一個引用類型的值時,引用類型值的引用次數(shù)就加1,當(dāng)這個變量指向另一個引用類型的值時,引用類型值的引用次數(shù)就減1.當(dāng)垃圾回收器進(jìn)行檢測時,發(fā)現(xiàn)引用類型的值被引用的次數(shù)等于0時就會回收其占用的空間.
這種垃圾回收機(jī)制會在循環(huán)引用中導(dǎo)致嚴(yán)重的內(nèi)存泄露,看下面例子:

function Test(){
    var obj1 = new Object();
  var obj2 = new Object();
  
  obj1.property = obj2;
  obj2.property = obj1;
}

當(dāng)Test函數(shù)執(zhí)行完成后,通過引用計數(shù)的機(jī)制進(jìn)行垃圾回收時,會發(fā)現(xiàn)obj1指向的引用類型值的引用計數(shù)為1(被obj2.property引用),obj2指向的引用類型值的引用計數(shù)為1(被obj1.property引用),因此這兩個引用類型的值就不會被回收,假如多次執(zhí)行此函數(shù)就會造成嚴(yán)重的內(nèi)存泄露.
為了解決這個問題需要手動釋放內(nèi)存:

obj1.property = null;
obj2.property = null;

IE瀏覽器中IE9以前的版本的BOM和DOM中的對象采用的就是引用計數(shù)的回收機(jī)制,因此我們在使用時需格外注意.
還有一點(diǎn)需要注意的是:全局環(huán)境中的變量只會在應(yīng)用程序結(jié)束(比如關(guān)閉瀏覽器)時才會離開執(zhí)行環(huán)境,所以我們需要盡可能的手動釋放無用的變量占用的內(nèi)存.

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

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

相關(guān)文章

  • 《Javascript高級程序設(shè)計 (第三版)》第四章 變量、作用域內(nèi)存問題

    摘要:在中雖然對象通過標(biāo)記清除的方式進(jìn)行垃圾收,但與對象卻是通過引用計數(shù)回收垃圾的,也就是說只要涉及及就會出現(xiàn)循環(huán)引用問題。如果垃圾收集例程回收的內(nèi)存分配量低于,則變量字面量和或數(shù)組元素的臨界值就會加倍。 只挑本人重要的寫(有夾雜其他補(bǔ)充) 基本類型和引用類型的值 描述:基本類型值指的是簡單的數(shù)據(jù)段,而引用類型值指那些可能由多個值構(gòu)成的對象。 動態(tài)的屬性 引用類型的值,我們可以為其添加屬性和...

    szysky 評論0 收藏0
  • 《JS高程3》—— 內(nèi)存回收垃圾收集、內(nèi)存泄漏

    摘要:局部變量只在函數(shù)執(zhí)行過程中存在。此時,局部變量就沒有存在的必要了,因此可以釋放它們的內(nèi)存以供將來使用。總結(jié)一般情況下,局部變量的生命周期為函數(shù)對象執(zhí)行到執(zhí)行結(jié)束,全局變量的生命周期為瀏覽器打開和關(guān)閉。 垃圾收集 JavaScript具有自動垃圾收集機(jī)制,也就是說,執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行中使用的內(nèi)存。在C和C++語言中,開發(fā)人員一項基本任務(wù)就是手工跟蹤內(nèi)存的使用情況,這是造成許多問題...

    qujian 評論0 收藏0
  • JavaScript學(xué)習(xí)筆記 - 變量、作用域與內(nèi)存問題

    摘要:語句中的塊語句對來說,將會指定對象添加到作用域鏈中。在嚴(yán)格模式下,初始化未經(jīng)聲明的變量會導(dǎo)致錯誤。查詢標(biāo)識符搜索過程從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標(biāo)識符。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。 4.1基本類型和引用類型的值 ECMAScript變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值?;绢愋椭傅氖呛唵蔚臄?shù)據(jù)段,而引用類型值指那些可...

    lavnFan 評論0 收藏0
  • JS學(xué)習(xí)筆記(第4章)(變量、作用域內(nèi)存問題)

    摘要:具體來說就是當(dāng)執(zhí)行流進(jìn)入下列任何一個語句時,作用域鏈就會得到加長語句的塊和語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對來說,會將指定的對象添加到作用域鏈中。 1. 基本類型和引用類型的值 JavaScript變量可以用來保存兩種類型的值:基本類性值和引用類性值?;绢愋椭翟醋砸韵?種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String?;?..

    linkin 評論0 收藏0
  • 復(fù)習(xí)Javascript專題(二):閉包,內(nèi)存,以及垃圾回收機(jī)制

    摘要:一個閉包就是當(dāng)一個函數(shù)返回時,一個沒有釋放資源的棧區(qū)所以參數(shù)和變量不會被垃圾回收機(jī)制回收。使用不當(dāng)會很容易造成內(nèi)存泄露。最后,垃圾回收器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。 1.什么是閉包?閉包有啥特性以及存在什么問題? 概念:閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。下面的outer就形成了一個閉包: function outer(){ co...

    hankkin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<