最近在重新復(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ì)改變作用域鏈。