延长作用域链
执行环境的类型总共只有两种——全局和局部(函数),但还是有其他办法来延长作用域链。
当执行流进入下列任何一个语句时,作用域链就会得到加长:
- try-catch 语句的catch 块
- with 语句
对with 语句来说,会将指定的对象添加到作用域链中。
对catch 语句来说,会创建一个新的变量对象。
javascript
function buildUrl() {
var qs = "?debug=true";
with (location) {
var url = href + qs;
}
return url;
}
在此,with 语句接收的是location 对象,因此其变量对象中就包含了 location 对象的所有属性和方法,而这个变量对象被添加到了作用域链的前端。当在with 语句中引用变量href 时(实际引用的是location.href),可以在当前执行环境的变量对象中找到。当引用变量qs 时,引用的则是在buildUrl()中定义的那个变量,而该变量位于函数环境的变量对象中。至于with 语句内部,则定义了一个名为url 的变量,因而url 就成了函数执行环境的一部分,所以可以作为函数的值被返回。