这是因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。具体来说,就是当执行流进入下列任何一个语句时,作用域链就会得到加长:
LdQ易塔云建站-模板下载,web开发资源,技术博客 □:try-catch语句的catch块
LdQ易塔云建站-模板下载,web开发资源,技术博客 □:with语句
LdQ易塔云建站-模板下载,web开发资源,技术博客这两个语句都会在作用域链的前端添加一个变量对象。对with来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。
LdQ易塔云建站-模板下载,web开发资源,技术博客LdQ易塔云建站-模板下载,web开发资源,技术博客For example:
function buildUrl() {LdQ易塔云建站-模板下载,web开发资源,技术博客
var qs = "?debug=true"LdQ易塔云建站-模板下载,web开发资源,技术博客
with(location) {LdQ易塔云建站-模板下载,web开发资源,技术博客
var url = href + qs;LdQ易塔云建站-模板下载,web开发资源,技术博客
}LdQ易塔云建站-模板下载,web开发资源,技术博客
return url;LdQ易塔云建站-模板下载,web开发资源,技术博客
}LdQ易塔云建站-模板下载,web开发资源,技术博客
const aaa = buildUrl();LdQ易塔云建站-模板下载,web开发资源,技术博客
console.log(aaa);LdQ易塔云建站-模板下载,web开发资源,技术博客
// file:///C:/Users/Administrator/Desktop/aaa.html?debug=true
案例中,with语句接收的location对象,因此其变量对象中就包含了location对象的所有属性和方法,而这个变量对象被添加到了作用域链的前端。
LdQ易塔云建站-模板下载,web开发资源,技术博客 □:buildUrl()函数定义了一个变量qs。
LdQ易塔云建站-模板下载,web开发资源,技术博客 □:当在with语句中引用变量href时(实际引用的是location.href),可以在当前执行环境的变量对象中找到。
LdQ易塔云建站-模板下载,web开发资源,技术博客 □:当引用变量qs时,引用的则是在buildUrl()中定义的那个变量,而该变量位于函数环境的变量对象中。
LdQ易塔云建站-模板下载,web开发资源,技术博客 □:with语句内部,定义了一个名为url的变量,因为url就成了函数执行环境的一部分,所以可以作为函数的值被返回。