最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 作用于作用域鏈的詳解

 更新時(shí)間:2017年09月27日 10:39:22   作者:我是漸漸呀  
這篇文章主要介紹了javascript 作用于作用域鏈的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,理解掌握這部分內(nèi)容,需要的朋友可以參考下

javascript 作用于作用域鏈的詳解

一、JavaScript作用域

任何程序設(shè)計(jì)語(yǔ)言都有作用域的概念,簡(jiǎn)單的說(shuō),作用域就是變量與函數(shù)的可訪問(wèn)范圍,即作用域控制著變量與函數(shù)的可見(jiàn)性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。

全局作用域(Global Scope)

在代碼中任何地方都能訪問(wèn)到的對(duì)象擁有全局作用域,一般來(lái)說(shuō)一下幾種情形擁有全局作用域:

(1)最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域,

例如:

var authorName="Burce_zxy";
function doSomething(){
var blogName="旅行的意義zxy";
function innerSay(){alert(blogName);
}
innerSay();
}
alert(authorName); //Bruce_zxyalert(blogName); //腳本錯(cuò)誤doSomething(); //旅行的意義zxyinnerSay() //腳本錯(cuò)誤

(2)所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域,例如:

function doSomething()
{
var authorName="Bruce_zxy";
blogName="旅行的意義zxy";
alert(authorName);
}
alert(blogName); //旅行的意義zxyalert(authorName); //腳本錯(cuò)誤

變量blogName擁有全局作用域,而authorName在函數(shù)外部無(wú)法訪問(wèn)到。

(3)所有window對(duì)象的屬性擁有全局作用域

一般情況下,window對(duì)象的內(nèi)置屬性都都擁有全局作用域,例如window.name、window.location、window.top等等。

局部作用域(Local Scope)

和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪問(wèn)到,最常見(jiàn)的例如函數(shù)內(nèi)部,所有在一些地方也會(huì)看到有人把這種作用域成為函數(shù)作用域,例如下列代碼中的blogName和函數(shù)innerSay都只擁有局部作用域。

function doSomething()
{
var blogName="旅行的意義zxy";
function innerSay(){alert(blogName);
}innerSay();
}
alert(blogName); 

二、作用域鏈(Scope Chain)

在JavaScript中,函數(shù)也是對(duì)象,實(shí)際上,JavaScript里一切都是對(duì)象。函數(shù)對(duì)象和其它對(duì)象一樣,擁有可以通過(guò)代碼訪問(wèn)的屬性和一系列僅供JavaScript引擎訪問(wèn)的內(nèi)部屬性。其中一個(gè)內(nèi)部屬性是[[Scope]],由ECMA-262標(biāo)準(zhǔn)第三版定義,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對(duì)象的集合,這個(gè)集合被稱(chēng)為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問(wèn)。

當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問(wèn)的數(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è)稱(chēng)為“運(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)行期上下文被銷(xiāo)毀,活動(dòng)對(duì)象也隨之銷(xiāo)毀。新的作用域鏈如下圖所示:

新作用域鏈

在函數(shù)執(zhí)行過(guò)程中,沒(méi)遇到一個(gè)變量,都會(huì)經(jīng)歷一次標(biāo)識(shí)符解析過(guò)程以決定從哪里獲取和存儲(chǔ)數(shù)據(jù)。該過(guò)程從作用域鏈頭部,也就是從活動(dòng)對(duì)象開(kāi)始搜索,查找同名的標(biāo)識(shí)符,如果找到了就使用這個(gè)標(biāo)識(shí)符對(duì)應(yīng)的變量,如果沒(méi)找到繼續(xù)搜索作用域鏈中的下一個(gè)對(duì)象,如果搜索完所有對(duì)象都未找到,則認(rèn)為該標(biāo)識(shí)符未定義。函數(shù)執(zhí)行過(guò)程中,每個(gè)標(biāo)識(shí)符都要經(jīng)歷這樣的搜索過(guò)程。

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

思南县| 霍邱县| 阿巴嘎旗| 建昌县| 宣汉县| 加查县| 垣曲县| 济宁市| 广南县| 库伦旗| 桦川县| 梅河口市| 大新县| 禄丰县| 泸西县| 蒲城县| 若尔盖县| 遵化市| 中西区| 武威市| 安新县| 馆陶县| 乌鲁木齐市| 永胜县| 邵东县| 汨罗市| 团风县| 洛阳市| 丹阳市| 琼结县| 于都县| 瑞安市| 湟中县| 新津县| 黄浦区| 新疆| 手机| 贵港市| 巴林左旗| 澳门| 泸西县|