1. 全局作用域(Global Scope)
在代碼中任何地方都能訪問到的對(duì)象擁有全局作用域,一般來說以下幾種情形擁有全局作用域:
(1)最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域,例如:
var authorName="山邊小溪";
function doSomething(){
var blogName="夢(mèng)想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(authorName); //山邊小溪
alert(blogName); //腳本錯(cuò)誤
doSomething(); //夢(mèng)想天空
innerSay() //腳本錯(cuò)誤
(2)所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域,例如:
function doSomething(){
var authorName="山邊小溪";
blogName="夢(mèng)想天空";
alert(authorName);
}
doSomething(); //山邊小溪
alert(blogName); //夢(mèng)想天空
alert(authorName); //腳本錯(cuò)誤
(3)所有window對(duì)象的屬性擁有全局作用域
一般情況下,window對(duì)象的內(nèi)置屬性都擁有全局作用域嗽仪,例如window.name、window.location、window.top等等题画。
1. 局部作用域(Local Scope)
和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪問到德频,最常見的例如函數(shù)內(nèi)部苍息,所有在一些地方也會(huì)看到有人把這種作用域稱為函數(shù)作用域,例如下列代碼中的blogName和函數(shù)innerSay都只擁有局部作用域壹置。
function doSomething(){
var blogName="夢(mèng)想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(blogName); //腳本錯(cuò)誤
innerSay(); //腳本錯(cuò)誤
作用域鏈(Scope Chain)
在JavaScript中竞思,函數(shù)也是對(duì)象,實(shí)際上钞护,JavaScript里一切都是對(duì)象盖喷。函數(shù)對(duì)象和其它對(duì)象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性难咕。其中一個(gè)內(nèi)部屬性是[[Scope]]课梳,由ECMA-262標(biāo)準(zhǔn)第三版定義,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對(duì)象的集合余佃,這個(gè)集合被稱為函數(shù)的作用域鏈暮刃,它決定了哪些數(shù)據(jù)能被函數(shù)訪問。
當(dāng)一個(gè)函數(shù)創(chuàng)建后爆土,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充沾歪。例如定義下面這樣一個(gè)函數(shù):
function add(num1,num2) {
var sum = num1 + num2;
return sum;
在函數(shù)add創(chuàng)建時(shí),它的作用域鏈中會(huì)填入一個(gè)全局對(duì)象雾消,該全局對(duì)象包含了所有全局變量灾搏,如下圖所示(注意:圖片只例舉了全部變量中的一部分):
函數(shù)add的作用域?qū)?huì)在執(zhí)行時(shí)用到。例如執(zhí)行如下代碼:
var total = add(5,10);
執(zhí)行此函數(shù)時(shí)會(huì)創(chuàng)建一個(gè)稱為“運(yùn)行期上下文(execution context)”的內(nèi)部對(duì)象立润,運(yùn)行期上下文定義了函數(shù)執(zhí)行時(shí)的環(huán)境狂窑。每個(gè)運(yùn)行期上下文都有自己的作用域鏈,用于標(biāo)識(shí)符解析桑腮,當(dāng)運(yùn)行期上下文被創(chuàng)建時(shí)泉哈,而它的作用域鏈初始化為當(dāng)前運(yùn)行函數(shù)的[[Scope]]所包含的對(duì)象。
這些值按照它們出現(xiàn)在函數(shù)中的順序被復(fù)制到運(yùn)行期上下文的作用域鏈中。它們共同組成了一個(gè)新的對(duì)象丛晦,叫“活動(dòng)對(duì)象(activation object)”奕纫,該對(duì)象包含了函數(shù)的所有局部變量、命名參數(shù)烫沙、參數(shù)集合以及this匹层,然后此對(duì)象會(huì)被推入作用域鏈的前端,當(dāng)運(yùn)行期上下文被銷毀锌蓄,活動(dòng)對(duì)象也隨之銷毀升筏。新的作用域鏈如下圖所示: