function one() {
var b = 1
function two() {
var a = 2
}
two()
function four(){
var c = 4
with (location) {
console.log(b)
console.log(c)
// console.log(a) //报错
}
}
four()
}
one()
}
buildUrl()
当代码执行到with 语句或者 try ...catch 中的catch块时,这两个语句都会在,作用域链的前端临时加一个变量对象,在代码执行完毕后,会被移除。
对with来说,会将指定对象添加到作用域链中。
对于catch语句来说,会创建一个新的变量对象,其中包含的是对错误对象的说明\
作者对于加到作用域链前端的理解:
with 或者 try....catch 语句可以看做一个执行环境
延长作用域不是将这两个环境加在作用于链的最前端,而是加在此环境的父执行环境的前端,此外,对一个执行环境的并列的执行环境,那些并列的执行环境并不会被加在它的作用域链中
如:对于with执行环境,它的作用域链是 with --> four --> one
并不会经过two,因此 在with环境中打印a的值时,会报错;"a is not defined"