摘要:中的變量是松散類型的即它在不同的時(shí)期可以有不同類型的值這也是最強(qiáng)大的的特性之一基本類型和引用類型的值的值類型有兩種基本類型引用類型。
ECMAscript中的變量是松散類型的,即它在不同的時(shí)期可以有不同類型的值,這也是ECMAscript最強(qiáng)大的的特性之一.
基本類型和引用類型的值javascript的值類型有兩種:基本類型 引用類型。基本類型的值是指的簡(jiǎn)單的數(shù)據(jù)段,基本類型有五種,依次是:Undefined Boolean String Number Null,而引用類型的值指的是由多個(gè)值構(gòu)成的對(duì)象.
基本類型值和引用類型值的區(qū)別 保存方式不同基本類型值的變量是保存確實(shí)的值.而引用類型值的變量保存的是一個(gè)指針,這個(gè)指針指向內(nèi)存中的對(duì)象.
引用類型的值可以動(dòng)態(tài)添加屬性和方法. 復(fù)制形式不同當(dāng)基本類型值的變量被復(fù)制給另一個(gè)變量時(shí),內(nèi)存中會(huì)新開(kāi)辟一個(gè)存儲(chǔ)空間來(lái)存儲(chǔ)這個(gè)新變量的值,新變量的值和被復(fù)制的變量的值保存在兩個(gè)不同的存儲(chǔ)空間中,它們相互獨(dú)立,互不影響.
當(dāng)引用類型值的變量被復(fù)制給另一個(gè)變量時(shí),內(nèi)存中不會(huì)開(kāi)辟新的空間,新變量保存的也是一個(gè)指向內(nèi)存中對(duì)象的指針,新變量和舊變量指向的是同一個(gè)存儲(chǔ)區(qū)域,因此改變其中一個(gè)變量的值,另一個(gè)變量也會(huì)隨之改變.
var name = "yuhualingfeng"; var anotherName = name; alert(anotherName); // yuhualingfeng anoherName = "Jake"; alert(anotherName); // Jake alert(name); //yuhualingfeng
如上所示,改變了anotherName的值并沒(méi)影響到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對(duì)象的name屬性值后,obj對(duì)象的name屬性值也隨之改變,這一點(diǎn)可以判斷出二者指向的是同一個(gè)存儲(chǔ)區(qū)域.
執(zhí)行環(huán)境(作用域)執(zhí)行環(huán)境是Javascript中最為重要的一個(gè)概念.執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問(wèn)的其他數(shù)據(jù),定義了它們各自的行為.每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象
全局執(zhí)行環(huán)境是最外層的執(zhí)行環(huán)境,全局執(zhí)行環(huán)境中有一個(gè)window全局對(duì)象,全局環(huán)境中的所有變量都可以通過(guò)window對(duì)象訪問(wèn).
除全局執(zhí)行環(huán)境外,每個(gè)函數(shù)也都有一個(gè)自己的執(zhí)行環(huán)境.當(dāng)執(zhí)行某個(gè)函數(shù)時(shí),會(huì)產(chǎn)生一個(gè)由變量對(duì)象組成的作用域鏈,作用域鏈的存在是為了讓解析器能夠有序的找尋標(biāo)識(shí)符,假如在函數(shù)中使用某個(gè)變量時(shí),首先解析器會(huì)在函數(shù)自身的變量對(duì)象中找尋這個(gè)變量的標(biāo)識(shí)符,假如沒(méi)找到,會(huì)繼續(xù)查找上一個(gè)變量對(duì)象,直到找到這個(gè)標(biāo)識(shí)符為止.查找標(biāo)識(shí)符時(shí),
解析器會(huì)從作用域鏈中函數(shù)自身的變量對(duì)象開(kāi)始尋找,直至全局執(zhí)行環(huán)境中的變量對(duì)象,假如在全局環(huán)境中的變量對(duì)象中沒(méi)找到標(biāo)識(shí)符,解析器就會(huì)拋出錯(cuò)誤.
var age = 30; function changeAge(){ age = 40; } changeAge(); alert(age); // 40
changeAge的作用域鏈中有兩個(gè)變量對(duì)象,自身的變量對(duì)象和全局環(huán)境的變量對(duì)象,當(dāng)執(zhí)行changeAge函數(shù)時(shí),調(diào)用了age變量,解析器先在changeAge變量對(duì)象中查找此變量,沒(méi)有找到,然后繼續(xù)查找上一個(gè)變量對(duì)象全局變量對(duì)象,找到了age變量.
有一點(diǎn)要注意的是,javascript中的作用域和其他編程語(yǔ)言不同,它沒(méi)有塊級(jí)作用域,看下面的例子:
function test(){ for(var i = 0,len =10;i < len;i++){ doSomething(i); console.log(i); // 10 } } test();
在for語(yǔ)句中定義的i變量,在for語(yǔ)句外可以被訪問(wèn)到.javascript中定義的變量會(huì)把它添加到最近執(zhí)行環(huán)境的變量對(duì)象中.這里會(huì)把i變量添加到test函數(shù)的變量對(duì)象中.
垃圾收集Javascript具有自動(dòng)垃圾收集機(jī)制,執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存.
垃圾回收機(jī)制的原理:垃圾收集器找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存,垃圾收集器會(huì)按固定的事件周期性的執(zhí)行內(nèi)存回收.
用于標(biāo)記無(wú)用變量策略因?qū)崿F(xiàn)而異,具體到瀏覽器中的插件,通常有以下兩種策略:標(biāo)記清楚 引用計(jì)數(shù)
標(biāo)記清除標(biāo)記清除是瀏覽器中最常用的一種垃圾收集方式.當(dāng)變量進(jìn)入環(huán)境時(shí)(例如用var 聲明一個(gè)變量),就將這個(gè)變量標(biāo)記為進(jìn)入環(huán)境,當(dāng)變量離開(kāi)環(huán)境時(shí),就將這個(gè)變量標(biāo)記為離開(kāi)環(huán)境,當(dāng)然,做這種標(biāo)記的方式可以有多種,比如可以通過(guò)翻轉(zhuǎn)某個(gè)特殊的位來(lái)記錄變量合適進(jìn)入環(huán)境,或者使用一個(gè)"進(jìn)入環(huán)境的"變量列表及一個(gè)"離開(kāi)環(huán)境的"變量列表來(lái)跟蹤哪個(gè)變量發(fā)生了變化.
垃圾回收器會(huì)給所有存儲(chǔ)在內(nèi)存中的變量都加上標(biāo)記(進(jìn)入環(huán)境),當(dāng)變量在執(zhí)行環(huán)境中無(wú)法被訪問(wèn)到時(shí),就會(huì)加上另一種標(biāo)記(離開(kāi)環(huán)境),待下一次垃圾回收器進(jìn)行回收時(shí)將回收其占用的內(nèi)存.
引用計(jì)數(shù)另一種不太常見(jiàn)的回收方式是引用計(jì)數(shù).引用計(jì)數(shù)就是計(jì)算出變量被引用的次數(shù),當(dāng)一個(gè)變量被賦值為一個(gè)引用類型的值時(shí),引用類型值的引用次數(shù)就加1,當(dāng)這個(gè)變量指向另一個(gè)引用類型的值時(shí),引用類型值的引用次數(shù)就減1.當(dāng)垃圾回收器進(jìn)行檢測(cè)時(shí),發(fā)現(xiàn)引用類型的值被引用的次數(shù)等于0時(shí)就會(huì)回收其占用的空間.
這種垃圾回收機(jī)制會(huì)在循環(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í)行完成后,通過(guò)引用計(jì)數(shù)的機(jī)制進(jìn)行垃圾回收時(shí),會(huì)發(fā)現(xiàn)obj1指向的引用類型值的引用計(jì)數(shù)為1(被obj2.property引用),obj2指向的引用類型值的引用計(jì)數(shù)為1(被obj1.property引用),因此這兩個(gè)引用類型的值就不會(huì)被回收,假如多次執(zhí)行此函數(shù)就會(huì)造成嚴(yán)重的內(nèi)存泄露.
為了解決這個(gè)問(wèn)題需要手動(dòng)釋放內(nèi)存:
obj1.property = null; obj2.property = null;
IE瀏覽器中IE9以前的版本的BOM和DOM中的對(duì)象采用的就是引用計(jì)數(shù)的回收機(jī)制,因此我們?cè)谑褂脮r(shí)需格外注意.
還有一點(diǎn)需要注意的是:全局環(huán)境中的變量只會(huì)在應(yīng)用程序結(jié)束(比如關(guān)閉瀏覽器)時(shí)才會(huì)離開(kāi)執(zhí)行環(huán)境,所以我們需要盡可能的手動(dòng)釋放無(wú)用的變量占用的內(nèi)存.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/92335.html
摘要:在中雖然對(duì)象通過(guò)標(biāo)記清除的方式進(jìn)行垃圾收,但與對(duì)象卻是通過(guò)引用計(jì)數(shù)回收垃圾的,也就是說(shuō)只要涉及及就會(huì)出現(xiàn)循環(huán)引用問(wèn)題。如果垃圾收集例程回收的內(nèi)存分配量低于,則變量字面量和或數(shù)組元素的臨界值就會(huì)加倍。 只挑本人重要的寫(xiě)(有夾雜其他補(bǔ)充) 基本類型和引用類型的值 描述:基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類型值指那些可能由多個(gè)值構(gòu)成的對(duì)象。 動(dòng)態(tài)的屬性 引用類型的值,我們可以為其添加屬性和...
摘要:局部變量只在函數(shù)執(zhí)行過(guò)程中存在。此時(shí),局部變量就沒(méi)有存在的必要了,因此可以釋放它們的內(nèi)存以供將來(lái)使用。總結(jié)一般情況下,局部變量的生命周期為函數(shù)對(duì)象執(zhí)行到執(zhí)行結(jié)束,全局變量的生命周期為瀏覽器打開(kāi)和關(guān)閉。 垃圾收集 JavaScript具有自動(dòng)垃圾收集機(jī)制,也就是說(shuō),執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行中使用的內(nèi)存。在C和C++語(yǔ)言中,開(kāi)發(fā)人員一項(xiàng)基本任務(wù)就是手工跟蹤內(nèi)存的使用情況,這是造成許多問(wèn)題...
摘要:語(yǔ)句中的塊語(yǔ)句對(duì)來(lái)說(shuō),將會(huì)指定對(duì)象添加到作用域鏈中。在嚴(yán)格模式下,初始化未經(jīng)聲明的變量會(huì)導(dǎo)致錯(cuò)誤。查詢標(biāo)識(shí)符搜索過(guò)程從作用域鏈的前端開(kāi)始,向上逐級(jí)查詢與給定名字匹配的標(biāo)識(shí)符。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。 4.1基本類型和引用類型的值 ECMAScript變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。基本類型指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類型值指那些可...
摘要:具體來(lái)說(shuō)就是當(dāng)執(zhí)行流進(jìn)入下列任何一個(gè)語(yǔ)句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語(yǔ)句的塊和語(yǔ)句。這兩個(gè)語(yǔ)句都會(huì)在作用域鏈的前端添加一個(gè)變量對(duì)象。對(duì)來(lái)說(shuō),會(huì)將指定的對(duì)象添加到作用域鏈中。 1. 基本類型和引用類型的值 JavaScript變量可以用來(lái)保存兩種類型的值:基本類性值和引用類性值?;绢愋椭翟醋砸韵?種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String。基本...
摘要:一個(gè)閉包就是當(dāng)一個(gè)函數(shù)返回時(shí),一個(gè)沒(méi)有釋放資源的棧區(qū)所以參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收。使用不當(dāng)會(huì)很容易造成內(nèi)存泄露。最后,垃圾回收器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。 1.什么是閉包?閉包有啥特性以及存在什么問(wèn)題? 概念:閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。下面的outer就形成了一個(gè)閉包: function outer(){ co...
閱讀 2772·2021-11-25 09:43
閱讀 2167·2021-11-24 09:39
閱讀 2149·2021-11-17 09:33
閱讀 2854·2021-09-27 14:11
閱讀 1998·2019-08-30 15:54
閱讀 3301·2019-08-26 18:27
閱讀 1320·2019-08-23 18:00
閱讀 1873·2019-08-23 17:53