JavaScript执行环境

本文深入探讨了JavaScript中的执行环境概念,包括全局执行环境和函数执行环境,并详细讲解了作用域链的形成及其在变量查找过程中的作用,同时提到了with语句和try-catch语句对作用域链的影响。

执行环境

所有变量(基本类型、引用类型以及函数)都存在于一个执行环境当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。

每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

执行环境可以划分为两类:

  • 全局执行环境

    全局执行环境是最外围的一个执行环境。根据ECMAScript实现所在的宿主环境不同,表示执行环境的变量对象也不一样。例如,在WEB浏览器中,与全局执行环境关联的变量对象是windows对象。

  • 函数执行环境

    每个函数都有自己的执行环境,函数执行环境的变量对象被称为活动对象,它在最开始只包含一个变量,即arguments对象。

作用域链

执行流每进入一个执行环境,都会创建一个作用域链

作用域链由执行环境的变量对象组成,作用域链的前端始终是当前执行环境的变量对象,下个变量对象来自外围环境,再下一个变量对象则来自下一个外围环境,一直延续到全局执行环境的变量对象。全局执行环境的变量对象始终都是作用域链中的最后一个变量对象。

作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。

延长作用域链

当执行流进入try - catch语句的catch块或者进入with语句,解释器就会再当前作用域链的最前端增加一个变量对象。这个变量对象是临时的,它会在语句执行完后被移除。

延长作用域链的特点是:

  1. 添加的变量对象是临时的,在语句执行完后将被移除
  2. 添加的变量对象不关联执行环境。这意味着在语句中声明的变量属于包含这些特殊语句的执行环境的变量对象。
var location = new Object();
location.href = "https://baidu.com/";

function buildUrl() {
    var qs = "search?wd=%s";
    
    with (location) {
        var url = href + qs;
    }
    alert(url);
}

buildUrl();

全局执行环境中定义了变量location和函数buildUrl,函数执行环境中定义了变量qsurlwith语句延长了函数执行环境的作用域链,解释器解析标识符href会首先在变量对象location搜所,如果没有延长作用域机制,我们无法解析href;此外,with语句不会创建执行环境,如果创建执行环境,当with语句结束,变量url将被销毁,我们无法在函数执行环境中访问,代码运行结果显然情况不是这样。

没有块级作用域

JavaScript没有块级作用域,变量的声明周期和执行环境有关。

var操作符声明的变量,将会添加到最近的执行环境的变量对象中。

JavaScript常用的垃圾收集方式是:

  • 标记清除
  • 引用计数

目前,众浏览器厂商推行J的avaScript的垃圾收集方式是标记清除(旧版本IE除外)。

转载于:https://www.cnblogs.com/weixia-blog/p/9769826.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值