一泵琳、變量
1摄职、變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值誊役。基本類型值指的是
簡單的數(shù)據(jù)段谷市,而引用類型值指那些可能由多個值構(gòu)成的對象蛔垢。
javaScript不允許直接訪問內(nèi)存中的位置,所以操作對象時操作的是對象引用迫悠。
2鹏漆、所有函數(shù)參數(shù)都是按值傳遞
function setName(obj){
? ? obj.name? = 'zhangsan'
}
var person = new Object()
setName(person);
console.log(person.name)? //? zhangsan
所以會有些人認(rèn)為函數(shù)參數(shù)傳遞是按引用傳遞方式。? 但是并不是這樣创泄。
function setName(obj){? //? 相當(dāng)于執(zhí)行了? let obj = person?
? ? obj.name? = 'zhangsan'艺玲;
? ? obj = new Object();
? ? obj.name? = 'lisi';
}
var person = new Object()
setName(person);
console.log(person.name)? //? zhangsan
二鞠抑、作用域
每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象饭聚,環(huán)境中定義的所有變量和函數(shù)都保存在這個變量中。
函數(shù)的執(zhí)行環(huán)境中 搁拙。? 活動對象為變量對象? ? 初始有一個arguments對象秒梳。
三、垃圾回收
1箕速、標(biāo)記清除(常用機(jī)制)
就說給那些無法訪問到的變量給標(biāo)記起來(例如函數(shù)中的變量)酪碘。? 進(jìn)行清除。
2弧满、引用計數(shù)(不常用)
對象被引用一次? +1 婆跑。? ? 解除引用關(guān)系? -1? ? ? 當(dāng)對象的引用計數(shù)為0時, 則清除庭呜。
優(yōu)化內(nèi)存的最佳方式滑进,就說執(zhí)行中的代碼只保存必要的數(shù)據(jù)。? 一旦數(shù)據(jù)不用募谎, 將其值設(shè)置為null扶关,來釋放引用。這一做法適用于大多數(shù)全局變量和全局對象的屬性数冬。
小結(jié):
基本類型值在內(nèi)存中占據(jù)固定大小的空間节槐,因此被保存在棧內(nèi)存中;
從一個變量向另一個變量復(fù)制基本類型的值,會創(chuàng)建這個值的一個副本;
引用類型的值是對象拐纱,保存在堆內(nèi)存中;
包含引用類型值的變量實際上包含的并不是對象本身铜异,而是一個指向該對象的指針;
從一個變量向另一個變量復(fù)制引用類型的值,復(fù)制的其實是指針秸架,因此兩個變量最終都指向同
一個對象;
確定一個值是哪種基本類型可以使用 typeof 操作符揍庄,而確定一個值是哪種引用類型可以使用 instanceof 操作符驳糯。
所有變量(包括基本類型和引用類型)都存在于一個執(zhí)行環(huán)境(也稱為作用域)當(dāng)中届搁,這個執(zhí) 行環(huán)境決定了變量的生命周期爆阶,以及哪一部分代碼可以訪問其中的變量斥扛。以下是關(guān)于執(zhí)行環(huán)境的幾 點總結(jié):
執(zhí)行環(huán)境有全局執(zhí)行環(huán)境(也稱為全局環(huán)境)和函數(shù)執(zhí)行環(huán)境之分;
每次進(jìn)入一個新執(zhí)行環(huán)境,都會創(chuàng)建一個用于搜索變量和函數(shù)的作用域鏈;
函數(shù)的局部環(huán)境不僅有權(quán)訪問函數(shù)作用域中的變量食茎,而且有權(quán)訪問其包含(父)環(huán)境蒂破,乃至全
局環(huán)境;
全局環(huán)境只能訪問在全局環(huán)境中定義的變量和函數(shù),而不能直接訪問局部環(huán)境中的任何數(shù)據(jù);
變量的執(zhí)行環(huán)境有助于確定應(yīng)該何時釋放內(nèi)存别渔。
JavaScript 是一門具有自動垃圾收集機(jī)制的編程語言附迷,開發(fā)人員不必關(guān)心內(nèi)存分配和回收問題∧坪可 以對 JavaScript 的垃圾收集例程作如下總結(jié)挟秤。
離開作用域的值將被自動標(biāo)記為可以回收,因此將在垃圾收集期間被刪除抄伍。
“標(biāo)記清除”是目前主流的垃圾收集算法艘刚,這種算法的思想是給當(dāng)前不使用的值加上標(biāo)記,然
后再回收其內(nèi)存截珍。
另一種垃圾收集算法是“引用計數(shù)”攀甚,這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。JavaScript
引擎目前都不再使用這種算法;但在 IE 中訪問非原生 JavaScript 對象(如 DOM 元素)時岗喉,這種
? 算法仍然可能會導(dǎo)致問題秋度。
當(dāng)代碼中存在循環(huán)引用現(xiàn)象時,“引用計數(shù)”算法就會導(dǎo)致問題钱床。
解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象荚斯,而且對垃圾收集也有好處。為了確保有效地回
? 收內(nèi)存查牌,應(yīng)該及時解除不再使用的全局對象事期、全局對象屬性以及循環(huán)引用變量的引用。