JavaScript执行环境

执行环境

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

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

执行环境能够划分为两类:java

  • 全局执行环境windows

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

  • 函数执行环境函数

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

做用域链

执行流每进入一个执行环境,都会建立一个做用域链url

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

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

延长做用域链

当执行流进入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除外)。

相关文章
相关标签/搜索