基本類型和引用類型的值
ECMASript中的變量包括兩種類型:基本類型和引用類型⊙梅裕基本類型值在內(nèi)存中占據(jù)的空間是固定的坤塞,因此被保存在棧內(nèi)存中霉猛。引用類型的值是對(duì)象惜浅,大小是不固定的坛悉,保存在堆內(nèi)存中。
- 復(fù)制變量值
基本類型的復(fù)制挣轨,可以理解為copy,直接復(fù)制一個(gè)值然后賦值給變量卷扮。兩者互不影響晤锹。如圖:
引用類型的復(fù)制鞭铆,也會(huì)將存儲(chǔ)在變量中的值復(fù)制給另外一個(gè)變量车遂。但是這個(gè)值是“指針”舶担。兩個(gè)變量的指針都指向存放在堆內(nèi)存中的同一個(gè)對(duì)象柄沮。例如:
- 參數(shù)傳遞
函數(shù)中參數(shù)傳遞都是按值傳遞废岂。當(dāng)然湖苞,引用類型的值也是“指針”。函數(shù)中的參數(shù)可以理解為一個(gè)局部變量镐作。而局部變量會(huì)在函數(shù)執(zhí)行完之后就會(huì)被銷毀该贾。
- 引用類型的類型檢測(cè)
let arr = [];
let fun = function () {
console.log('fun...')
};
let obj = {};
console.log(arr instanceof Array) // true
console.log(fun instanceof Function) // true
console.log(obj instanceof Object) //true
執(zhí)行環(huán)境及作用域
- 執(zhí)行環(huán)境定義了變量和函數(shù)有權(quán)訪問(wèn)的數(shù)據(jù)捌臊,每個(gè)執(zhí)行環(huán)境都有一個(gè)與之對(duì)應(yīng)的環(huán)境變量對(duì)象。環(huán)境中的定義的所有變量和函數(shù)都掛載到這個(gè)環(huán)境變量對(duì)象中逞力。對(duì)開(kāi)發(fā)者不可見(jiàn)寇荧,處理器在處理數(shù)據(jù)的時(shí)候會(huì)用到它揩抡。
- 某個(gè)執(zhí)行環(huán)境在運(yùn)行完畢之后,該執(zhí)行環(huán)境的所有變量和函數(shù)會(huì)被銷毀添祸。
- 代碼在一個(gè)環(huán)境中執(zhí)行的時(shí)候寻仗,會(huì)為該環(huán)境變量對(duì)象創(chuàng)建一個(gè)作用域署尤,作用域保證了該執(zhí)行環(huán)境對(duì)變量和函數(shù)的訪問(wèn)順序和規(guī)則曹体。(當(dāng)前環(huán)境的變量和函數(shù)優(yōu)先級(jí)最高箕别,然后層層向上訪問(wèn),直到找不到為止)除抛。例:
// 這里可以訪問(wèn)window的執(zhí)行環(huán)境母截。內(nèi)部的執(zhí)行環(huán)境可以訪問(wèn)他外部的執(zhí)行環(huán)境到忽,而外部的執(zhí)行環(huán)境則不可以訪問(wèn)內(nèi)部的執(zhí)行環(huán)境的變量和函數(shù)
var name = 'window'
function out() {
//這里可以訪問(wèn)out->window的執(zhí)行環(huán)境
var name = 'out function...'
function inner() {
//這里可以訪問(wèn)inner->out->window的執(zhí)行環(huán)境
var name = 'inner function...'
console.log('inner: ', name)
}
console.log('out: ', name)
inner()
}
out()
console.log(name)
//結(jié)果
//out: out function...
//out: inner: inner function...
//out: window
- 沒(méi)有塊級(jí)作用域
塊就是{},例如:
if(true) {
}
這個(gè)說(shuō)法現(xiàn)在有點(diǎn)問(wèn)題清寇,應(yīng)該說(shuō)ES5只有全局作用域和函數(shù)作用域喘漏,沒(méi)有塊級(jí)作用域。es6新增的let和const是由塊級(jí)作用域的概念的华烟。函數(shù)是有作用域的翩迈,可以稱之為“函數(shù)作用域”
垃圾回收
javascript具有自動(dòng)的垃圾回收機(jī)制。有兩種回收機(jī)制:標(biāo)記清除和引用計(jì)數(shù)盔夜。
- 標(biāo)記清除
變量進(jìn)入環(huán)境時(shí)负饲,被標(biāo)記為“進(jìn)入環(huán)境”搅方。變量離開(kāi)時(shí),標(biāo)記為“變量離開(kāi)”绽族。
- 引用計(jì)數(shù)
跟蹤記錄每一個(gè)值被引用的次數(shù)。聲明了一個(gè)變量并將一個(gè)引用類型的值賦值給該變量時(shí),引用次數(shù)+1吧慢。如果同一個(gè)值又被賦值給另外一個(gè)變量瓢剿,引用次數(shù)+1攻泼。如果包含這個(gè)值的變量又引用了另外一個(gè)值,則次數(shù)-1.
- 管理內(nèi)存
解除引用 如果數(shù)據(jù)不在有用,手動(dòng)將其值設(shè)置為null可以釋放引用。以便垃圾收集器下次運(yùn)行時(shí)將其回收拾稳。
引用
javascript高級(jí)程序第三版