全部变量(基本类型、引用类型以及函数)都存在于一个执行环境当中,这个执行环境决定了变量的生命周期,以及哪一部分代码能够访问其中的变量。javascript
每一个执行环境都有一个与之关联的变量对象,环境中定义的全部变量和函数都保存在这个对象中。前端
执行环境能够划分为两类:java
全局执行环境windows
全局执行环境是最外围的一个执行环境。根据ECMAScript实现所在的宿主环境不一样,表示执行环境的变量对象也不同。例如,在WEB浏览器中,与全局执行环境关联的变量对象是windows
对象。浏览器
函数执行环境函数
每一个函数都有本身的执行环境,函数执行环境的变量对象被称为活动对象,它在最开始只包含一个变量,即arguments
对象。ui
执行流每进入一个执行环境,都会建立一个做用域链。url
做用域链由执行环境的变量对象组成,做用域链的前端始终是当前执行环境的变量对象,下个变量对象来自外围环境,再下一个变量对象则来自下一个外围环境,一直延续到全局执行环境的变量对象。全局执行环境的变量对象始终都是做用域链中的最后一个变量对象。code
做用域链的用途是保证对执行环境有权访问的全部变量和函数的有序访问。对象
当执行流进入try - catch
语句的catch
块或者进入with
语句,解释器就会再当前做用域链的最前端增长一个变量对象。这个变量对象是临时的,它会在语句执行完后被移除。
延长做用域链的特色是:
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
,函数执行环境中定义了变量qs
和url
。with
语句延长了函数执行环境的做用域链,解释器解析标识符href
会首先在变量对象location
搜所,若是没有延长做用域机制,咱们没法解析href
;此外,with
语句不会建立执行环境,若是建立执行环境,当with
语句结束,变量url
将被销毁,咱们没法在函数执行环境中访问,代码运行结果显然状况不是这样。
JavaScript没有块级做用域,变量的声明周期和执行环境有关。
var
操做符声明的变量,将会添加到最近的执行环境的变量对象中。
JavaScript经常使用的垃圾收集方式是:
目前,众浏览器厂商推行J的avaScript的垃圾收集方式是标记清除(旧版本IE除外)。