延长作用域链

54 阅读1分钟

    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"