JavaScript执行环境及作用域(二)——延长作用域链

探讨JavaScript中作用域链的概念,特别是在try-catch和with语句中如何临时增加变量对象,以及这些对象如何影响代码执行流程。通过具体示例说明with语句如何改变作用域链,以及其对变量搜索机制的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然执行环境的类型总共只有两种——全局和局部(函数),但还是有办法来延长作用域链的,这么说是因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。在两种情况下会发生这种现象。具体来说,就是当执行流进入下列任何语句时,作用域链就会得到加长:

  1. try-catch语句的catch块。
  2. with语句。

这两个语句都会在作用域链的前端添加一个变量对象。对with语句来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。下面看一个例子:

var mother = {
    name: 'Rose',
    age: 30
}

function father(){
    var fName = 'Jack';
    var name = '张三';

    function son(){
        var sName = 'son';
        with(mother){
            var word = 'my name: ' + sName + ', father name: ' + fName +
                ', mother name: ' + name + ", mother age: " + age;
        }
        console.log(word);//my name: son, father name: Jack, mother name: Rose, mother age: 30
    }
    son();
}
father();

首先声明一个对象mother,包含两个属性:nameage,然后定义一个函数father,里面声明两个变量:fNamename,又声明一个函数sonson中定义了一个变量sName和一个with语句块。我们来看打印的结果,mother name为对象mother中的Rose,而不是函数father中的张三,这就是with语句在起作用。

在Chrome中调试可以发现,如下图:

代码执行到19行with语句块中时,作用域链的前端增加了一个With Block作用域,根据作用域链搜索机制,此时的name应该是Rose

再看下图:

代码执行到22行,with语句块执行结束,with作用域从作用域链中移除,with语句块中声明的变量绑定在with所在的函数中,所以console.log(word)可以正常输出word

转载于:https://my.oschina.net/bob1900/blog/2985802

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值