JavaScript執(zhí)行環(huán)境及作用域鏈實(shí)例分析
本文實(shí)例講述了JavaScript執(zhí)行環(huán)境及作用域鏈。分享給大家供大家參考,具體如下:
1、執(zhí)行環(huán)境:
每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。
執(zhí)行環(huán)境包括全局執(zhí)行環(huán)境和函數(shù)執(zhí)行環(huán)境。
全局執(zhí)行環(huán)境是最外圍的一個(gè)執(zhí)行環(huán)境,在瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是是window對(duì)象,所有全局變量和屬性都是作為window對(duì)象的屬性和方法創(chuàng)建的。
函數(shù)執(zhí)行環(huán)境是指函數(shù)的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境會(huì)被推入一個(gè)環(huán)境棧中,在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,將控制權(quán)返回到之前的執(zhí)行環(huán)境。
2、作用域鏈:
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。
作用域鏈的用途:保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。
作用域鏈的前端,始終是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象,若此環(huán)境是函數(shù),則將其活動(dòng)對(duì)象作為變量對(duì)象?;顒?dòng)對(duì)象最開始時(shí)只包含一個(gè)變量,即arguments對(duì)象(該對(duì)象在全局環(huán)境中是不存在的),作用域鏈的下一個(gè)對(duì)象來(lái)自包含環(huán)境,再下一個(gè)變量則來(lái)自下一個(gè)包含環(huán)境,這樣一直延續(xù)到全局執(zhí)行環(huán)境。全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈的最后一個(gè)對(duì)象。
每個(gè)環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數(shù)名,終點(diǎn)就是搜索到全局執(zhí)行環(huán)境,但是任何環(huán)境不能通過(guò)向下搜索作用域鏈而進(jìn)入另一個(gè)執(zhí)行環(huán)境。內(nèi)部環(huán)境可以通過(guò)作用域鏈訪問(wèn)所有的外部環(huán)境,但外部環(huán)境不能訪問(wèn)內(nèi)部環(huán)境的任何變量和函數(shù)。
3、延長(zhǎng)作用域鏈:
雖然執(zhí)行環(huán)境只有兩種:全局執(zhí)行環(huán)境和函數(shù)執(zhí)行環(huán)境,但是可以有方法延長(zhǎng)作用域鏈,因?yàn)橛行┱Z(yǔ)句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象,該變量對(duì)象會(huì)在代碼執(zhí)行后被移除。
當(dāng)執(zhí)行流進(jìn)入下列語(yǔ)句時(shí),作用域鏈會(huì)延長(zhǎng):
(1)try-catch語(yǔ)句的catch塊:catch語(yǔ)句會(huì)創(chuàng)建一個(gè)新的變量對(duì)象,其中包含的是被拋出的錯(cuò)誤對(duì)象的聲明,該變量對(duì)象只在catch塊內(nèi)部有效,在catch塊外部無(wú)法訪問(wèn)到。
(2)with語(yǔ)句:with語(yǔ)句會(huì)將指定的對(duì)象添加到作用域鏈中。
eg1:
function setUrl(){
var parameter="?name=Alice";
var url = href + parameter;
return url;
}
var result = setUrl();
alert(result);//報(bào)錯(cuò):href is no defined
eg2:
function setUrl(){
var parameter="?name=Alice";
with(location) {
var url = href + parameter;
}
return url;
}
var result = setUrl();
alert(result);//http://localhost/text.html?name=Alice
with語(yǔ)句接收的是location對(duì)象,因此其變量對(duì)象中包含了location對(duì)象的所有屬性和方法,location對(duì)象被添加到了作用域鏈的前端。
eg3:
var obj = {href : "http://www.baidu.com"};
var ;
function setUrl(){
var parameter="?name=Alice";
with(obj) {
;
var url = href + parameter;
}
return url;
}
var result = setUrl();
alert(result);//http://www.google.cn?name=Alice
alert(href);//http://www.sina.cn
with語(yǔ)句中并沒(méi)有更改變量href的值,而是更改了obj對(duì)象的 href 屬性。
也就是說(shuō),with中首先查找的是相關(guān)對(duì)象的屬性,如果沒(méi)有,才改變變量的值。
eg4:
var obj = {};
var ;
function setUrl(){
var parameter="?name=Alice";
with(obj) {
;
var url = href + parameter;
}
return url;
}
var result = setUrl();
alert(result);//http://www.google.cn?name=Alice
alert(href);//http://www.google.cn
去掉obj對(duì)象的 href 屬性后,才更改變量href的值。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript 仿關(guān)機(jī)效果的圖片層
最近發(fā)現(xiàn)了一用 YUI 做的 Lightbox, 只需少量的設(shè)置就能類Window關(guān)機(jī)的效果來(lái)顯示圖片。2008-12-12
js用于樹型結(jié)構(gòu)級(jí)聯(lián)選擇
js用于樹型結(jié)構(gòu)級(jí)聯(lián)選擇...2007-01-01
Google Map Api和GOOGLE Search Api整合實(shí)現(xiàn)代碼
將GOOGLE MAP API 和 GOOGLE Search API 進(jìn)行整合,我用面向?qū)ο蟮姆绞綄懥艘粋€(gè)類,通過(guò)傳一個(gè)經(jīng)緯度進(jìn)去,自動(dòng)通過(guò)GOOGLE LOCAL SEARCH獲取附近的相關(guān)信息。比如餐廳、景點(diǎn)等,反過(guò)來(lái)標(biāo)到地圖上,并可在任意容器內(nèi)顯示。2009-07-07
JavaScript彈出新窗口并控制窗口移動(dòng)到指定位置的方法
這篇文章主要介紹了JavaScript彈出新窗口并控制窗口移動(dòng)到指定位置的方法,涉及javascript針對(duì)彈出窗口的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
細(xì)數(shù)localStorage的用法及使用注意事項(xiàng)
這篇文章主要介紹了細(xì)數(shù)localStorage的用法及使用注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04

