變量、作用域和內(nèi)存問(wèn)題
1.?基本類型值(簡(jiǎn)單的數(shù)據(jù)段),引用類型值(可能由多個(gè)值構(gòu)成的對(duì)象)
2.?動(dòng)態(tài)屬性
var person = new Object();
person.name = "dyh";
alert(person.name);
注意:不能給基本類型的值添加屬性,盡管這樣做不會(huì)報(bào)錯(cuò)。
var name = "dyh";
name.age = 12;
alert(name.age); // undefined
3.?傳遞參數(shù)
ECMScript 中所以有的函數(shù)都是按值傳遞的。基本類型值則是復(fù)制值給函數(shù)內(nèi)的局部變量,引用類型則是傳指針。
4.?檢查類型
基本類型中使用 typeof:
var num = 1;
alert(typeof num);
引用類型中使用instanceof:
alert(person instanceof Array); // person 是 Array 對(duì)象嗎?
person instanceof Object; // 始終是 true
隨意 instanceof 基本類型; // 始終是 false
5.?執(zhí)行環(huán)境及作用域
執(zhí)行環(huán)境定義了變量或者函數(shù)有訪問(wèn)的其他數(shù)據(jù),決定它們各自的行為。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象(variable object),環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中,我們無(wú)法訪問(wèn),但解析器可以使用。
全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境,每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行進(jìn)入一個(gè)函數(shù)時(shí), 函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧,其它執(zhí)行完后,棧將其它環(huán)境彈出,控制權(quán)返回之前的環(huán)境。
作用域鏈:保證執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈中的最后一個(gè)對(duì)象。(相當(dāng)于繼承,子級(jí)能訪問(wèn)父級(jí),父級(jí)不能訪問(wèn)子級(jí))
6.?延長(zhǎng)作用域鏈
- try-catch 語(yǔ)句的catch塊
- with 語(yǔ)句
這兩個(gè)語(yǔ)句都會(huì)在作用域鏈的前端添加一個(gè)對(duì)象變量,with 是將指定的對(duì)象添加到域鏈中,catch 是創(chuàng)建一個(gè)新的變量對(duì)象,包含被拋出的錯(cuò)誤對(duì)象聲明。
7.?沒(méi)有塊級(jí)作用域(重要)
在c語(yǔ)言中,花括號(hào)封閉的代碼塊都有自己的作用域,但在javascrip中并不是這樣,如:
if (true) {
var num = 100;
}
alert(num); // num = 100
for (var i = 0; i < 10; i++) {
}
alert(i); // i = 10
8.? 垃圾收集
javascript 具有自動(dòng)垃圾收集機(jī)制。類似java??梢允謾C(jī)釋放,如:
var person = new Object();
person = null; // 手動(dòng)釋放引用
小結(jié)
這一章最需要注意的是:沒(méi)有塊級(jí)作用域。