最近在重新复习js基础知识,所以自己准备做个容易混淆题集,如果有什么问题还请大家多多指教^^
问题:下面哪种方式不能改变作用域链?
A、with
B、try-catch
C、while
D、eval
答案:C
解析:
>with:对于with语句来说,将会指定的对象添加到作用域链中
>tr-catch:红皮书第四章说到,虽然执行环境的类型总共只有两种(全局和局部),但还是有其他办法来延长作用域链。因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。try catch中的catch块,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。
example:
function builderUrl(){
var qs = '?debug = true";
with (location){
var url = href + qs;
}
return url;
}
这个例子中with语句接受的是location对象,因此其变量对象中就包含了location对象的所有属性和方法,而这个变量对象被添加到作用域链的前端。builderUrl()函数中定义了一个变量qs。当在with语句中引用变量href时(实际引用的是location.href),可以在当前执行环境的变量对象中找到。当引用变量qs时,引用的则是在builderUrl()中定义的这个变量,而该变量位于函数环境的变量对象中。至于with语句内部,则定义了一个名为url的变量,因而url就成了函数执行环节的一个部分,所以可以作为函数的值被返回
>eval:是把字符串转换为js代码,如果字符串中有新定义函数,那么它就有可能再建一个执行环境。
>while:只是在函数局部环境或者全局环境运行,并不会改变作用域链。