0%

执行上下文和作用域

执行上下文有全局上下文和函数上下文,块级上下文:

上下文中的代码在执行时,会创建变量对象的一个作用域链,这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序,代码正在执行的上下文的变量对象始终位于作用域链的最前端,如果上下文时函数,则其活动对象用作变量对象,作用域链中的下一个变量对象来自包含上下文…以此类推至全局上下文,全局上下文变量对象始终是作用域链的最后一个变量对象(window)

作用域链增强

执行上下文主要有全局上下文和函数上下文两种(eval()调用内部存在第三种上下文),但有其他方式增强作用域链,

try/catch语句中的catch块

with语句

这两种情况会在作用域链的前端添加一个变量对象,对with语句来说,会向作用域链前端添加指定对象,对catch语句,会创建一个新的变量对象,这个变量对象会包含要抛出的错误对象的声明

1
2
3
4
5
6
7
function buildUrl(){
let qs="?debug=true";
with(location){
let url=href+qs;
}
return url;
}

with语句将location对象作为上下文,因此location会被添加到作用域链的前端