with/try-catch/eval改變作用域鏈

最近在重新復(fù)習(xí)js基礎(chǔ)知識(shí),所以自己準(zhǔn)備做個(gè)容易混淆題集,如果有什么問(wèn)題還請(qǐng)大家多多指教^^

問(wèn)題:下面哪種方式不能改變作用域鏈?

?A、with

B、try-catch

C、while

D、eval

答案:C

解析:

>with:對(duì)于with語(yǔ)句來(lái)說(shuō),將會(huì)指定的對(duì)象添加到作用域鏈中

>tr-catch:紅皮書第四章說(shuō)到,雖然執(zhí)行環(huán)境的類型總共只有兩種(全局和局部),但還是有其他辦法來(lái)延長(zhǎng)作用域鏈。因?yàn)橛行┱Z(yǔ)句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象,該變量對(duì)象會(huì)在代碼執(zhí)行后被移除。try catch中的catch塊,會(huì)創(chuàng)建一個(gè)新的變量對(duì)象,其中包含的是被拋出的錯(cuò)誤對(duì)象的聲明。

?? example:

function builderUrl(){

var qs = '?debug = true";

with (location){

? var url = href + qs;

}

return url;

}

這個(gè)例子中with語(yǔ)句接受的是location對(duì)象,因此其變量對(duì)象中就包含了location對(duì)象的所有屬性和方法,而這個(gè)變量對(duì)象被添加到作用域鏈的前端。builderUrl()函數(shù)中定義了一個(gè)變量qs。當(dāng)在with語(yǔ)句中引用變量href時(shí)(實(shí)際引用的是location.href),可以在當(dāng)前執(zhí)行環(huán)境的變量對(duì)象中找到。當(dāng)引用變量qs時(shí),引用的則是在builderUrl()中定義的這個(gè)變量,而該變量位于函數(shù)環(huán)境的變量對(duì)象中。至于with語(yǔ)句內(nèi)部,則定義了一個(gè)名為url的變量,因而url就成了函數(shù)執(zhí)行環(huán)節(jié)的一個(gè)部分,所以可以作為函數(shù)的值被返回

>eval:是把字符串轉(zhuǎn)換為js代碼,如果字符串中有新定義函數(shù),那么它就有可能再建一個(gè)執(zhí)行環(huán)境。

>while:只是在函數(shù)局部環(huán)境或者全局環(huán)境運(yùn)行,并不會(huì)改變作用域鏈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容