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

資訊專欄INFORMATION COLUMN

高程(第四章) 變量、作用域和內(nèi)存問(wèn)題

xavier / 2992人閱讀

摘要:不允許直接訪問(wèn)內(nèi)存中的位置,也就是說(shuō)不能直接操作對(duì)象的內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運(yùn)行時(shí)將其回收

1 基本類型和引用類型的值

基本數(shù)據(jù)類型是按值訪問(wèn)的,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際的值

基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中

引用類型的值是保存在內(nèi)存中的對(duì)象。JavaScript不允許直接訪問(wèn)內(nèi)存中的位置,也就是說(shuō)不能直接操作對(duì)象的內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。為此,引用類型的值是按引用的。

以上關(guān)于引用類型的說(shuō)法不嚴(yán)密,當(dāng)復(fù)制保存著對(duì)象的某個(gè)變量時(shí),操作的是對(duì)象的引用。但在為對(duì)象添加屬性時(shí),操作的是實(shí)際的對(duì)象
引用類型的值是對(duì)象,保存在堆內(nèi)存中

1.1 動(dòng)態(tài)的屬性

不能給基本類型的值添加屬性,盡管這樣做不會(huì)導(dǎo)致任何錯(cuò)誤

1.2 復(fù)制變量值

從一個(gè)變量向另一個(gè)變量復(fù)制基本類型的值,會(huì)創(chuàng)建這個(gè)值的一個(gè)副本

包含引用類型值的變量實(shí)際上包含的并不是對(duì)象本身,而是一個(gè)指向該對(duì)象的指針

1.3 傳遞參數(shù)

ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。也就是說(shuō),把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣

1.4 檢測(cè)類型

確定一個(gè)值是哪種基本類型可以使用typeof操作符,而確定一個(gè)值是哪種引用類型可以使用instanceof操作符

console.log(typeof s);    //檢測(cè)變量s是哪種基本類型值
console.log(colors instanceof Array);    //檢測(cè)變量colors是否引用類型Array
2 執(zhí)行環(huán)境及作用域

每個(gè)環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。雖然我們編寫的代碼無(wú)法訪問(wèn)這個(gè)對(duì)象,但解析器在處理數(shù)據(jù)時(shí)會(huì)在后臺(tái)使用它

2.1 延長(zhǎng)作用域鏈

執(zhí)行環(huán)境的類型總共只有兩種——全局和局部(函數(shù)),但是還有其他辦法來(lái)延長(zhǎng)作用域鏈

以下兩個(gè)語(yǔ)句都會(huì)在作用互聯(lián)的前端添加一個(gè)變量對(duì)象:

try-catch語(yǔ)句的catch塊

catch會(huì)創(chuàng)建一個(gè)新的變量對(duì)象,其中包含的是被拋出的錯(cuò)誤對(duì)象的聲明

with語(yǔ)句

with語(yǔ)句會(huì)將指定的對(duì)象添加到作用域鏈中

2.2 沒(méi)有塊級(jí)作用域

if或者for語(yǔ)句中定義的變量在代碼塊執(zhí)行結(jié)束后,會(huì)存在于代碼塊外部的執(zhí)行環(huán)境中

3 垃圾收集 3.1 標(biāo)記清除

垃圾收集器在運(yùn)行的時(shí)候會(huì)給儲(chǔ)存在內(nèi)存中的所有變量都加上標(biāo)記(當(dāng)然,可以使用任何標(biāo)記方式)。然后,它會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。而在此之后再被加上標(biāo)記的變量被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量以及無(wú)法訪問(wèn)到這些變量了。最后,垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間

"標(biāo)記清除"是目前主流的垃圾收集算法

3.2 引用計(jì)數(shù)

引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。當(dāng)聲明了一個(gè)變量并將一個(gè)引用類型值賦給該變量時(shí),則這個(gè)值的引用次數(shù)就是1。如果同一個(gè)值又被賦給另一個(gè)值,則這個(gè)值的引用次數(shù)減1。當(dāng)這個(gè)值的引用次數(shù)變成0時(shí),則說(shuō)明沒(méi)有辦法再訪問(wèn)這個(gè)值了,因而就可以將其占用的內(nèi)存空間回收回來(lái)

這種引用計(jì)數(shù)策略存在一個(gè)嚴(yán)重的問(wèn)題:循環(huán)引用

function problem(){
    var objectA = new Object();
    var objectB = new Object();
    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}

上面例子中,objectA和objectB通過(guò)各自的屬性互相引用,它們的引用次數(shù)永遠(yuǎn)不會(huì)是0。假如這個(gè)函數(shù)被重復(fù)多次調(diào)用,就會(huì)導(dǎo)致大量?jī)?nèi)存得不到回收

3.4 管理內(nèi)存

一旦數(shù)據(jù)不再有用,最好通過(guò)將其值設(shè)置為null來(lái)釋放其引用——這個(gè)做法叫做解除引用(dereferencing)

function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
}
var globalPerson = createPerson("Nicholas");

globalPerson = null;    //手工解除globalPerson的引用

解除一個(gè)值得引用并不意味著自動(dòng)回收該值所占用的內(nèi)存。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運(yùn)行時(shí)將其回收

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

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

相關(guān)文章

  • 高程3總結(jié)#第4章變量、作用域和內(nèi)存問(wèn)題

    摘要:當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。 變量、作用域和內(nèi)存問(wèn)題 基本類型和引用類型的值 基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類型值值那些可能由多個(gè)值構(gòu)成的對(duì)象。 定義基本類型值的引用和引用類型值的方法是類似的,創(chuàng)建...

    xumenger 評(píng)論0 收藏0
  • 《Javascript高級(jí)程序設(shè)計(jì) (第三版)》四章 變量、作用域和內(nèi)存問(wèn)題

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

    szysky 評(píng)論0 收藏0
  • 四章 變量作用域和內(nèi)存問(wèn)題

    摘要:如果在局部環(huán)境沒(méi)有找到該變量名,則繼續(xù)沿作用域鏈向上搜索。很明顯,訪問(wèn)局部變量要比訪問(wèn)全局變量更快,因?yàn)椴挥孟蛏纤阉髯饔糜蜴湣? 按照ECMA-262定義,JavaScript的變量松散類型的本質(zhì),決定了: 它還只是在特定時(shí)間用于保存特定值的一個(gè)名字而已。 變量的值及其數(shù)據(jù)類型可以再腳本的生命周期內(nèi)改變。 4.1 基本類型和引用類型的值 基本類型 簡(jiǎn)單的數(shù)據(jù)段(Undefine...

    AlphaWatch 評(píng)論0 收藏0
  • JS核心知識(shí)點(diǎn)梳理——上下文、作用域、閉包、this(上)

    摘要:引言滿滿的干貨,面試必系列,參考大量資料,并集合自己的理解以及相關(guān)的面試題,對(duì)核心知識(shí)點(diǎn)中的作用域閉包上下文進(jìn)行了梳理。如果在小區(qū)這個(gè)作用域找到了張老師,我就會(huì)在張老師的輔導(dǎo)下學(xué)鋼琴我張老師房間鋼琴構(gòu)成了學(xué)琴的上下文環(huán)境。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 滿滿的干貨,面試必bei系列,參考大...

    Andrman 評(píng)論0 收藏0
  • JS基礎(chǔ)知識(shí):變量對(duì)象、作用域鏈和閉包

    摘要:前言這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運(yùn)行。是變量對(duì)象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對(duì)符合訪問(wèn)權(quán)限的變量和函數(shù)的有序訪問(wèn)。 前言:這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。之前看《JS高程》和一些技術(shù)博客,對(duì)于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...

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

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

0條評(píng)論

xavier

|高級(jí)講師

TA的文章

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