DOM笔记(八):JavaScript执行环境和垃圾收集

一、执行环境

在有关于JavaScript对象或者this的指向问题时,脱离不了的另外一个概念就是执行环境,即上下文环境。执行环境在JavaScript是一个很重要的概念,因为它定义了变量或函数有权访问的其它数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,在该环境中定义的所有变量和函数都保存在这个对象中。

全局环境时最外围的一个执行环境。在Web浏览器中,全局环境被认为是Window对象(后续笔记中会讨论),因此所有的全局变量和函数都是作为window对象的属性或者方法创建的。全局执行环境直到应用程序退出,例如关闭网页或者浏览器,才会被销毁。

与之对应的就是局部环境。每个函数就形成一个局部环境,当所有代码执行完毕之后,该环境即被销毁,保存其中的所有变量和函数定义也随之销毁。

  1、作用域链

当代码在一个环境中执行时,会创建对象的一个作用域链。作用域链的前端始终是当前执行的代码所在的环境变量对象,而作用域链的最后一个对象始终是全局环境的变量对象。需要注意的是,对于函数,其活动对象包含的初识变量是arguments对象,而在全局环境中是没有这个对象的。

var color="blue";
function changeColor()
{
     var anotherColor="red";
     function swapColor()
     {
          var tempColor = anotherColor;
          anotherColor = color;
          color = tempColor;
     }
     swapColor();
}
changeColor()

以上代码共涉及3个执行环境:全局环境、changeColor()的局部环境和swapColor()的局部环境。作用域链如下:

最外围是全局环境对象window(蓝色部分),其包含变量color和函数changeColor。changeColor()的局部环境则包含变量anotherColor和函数swapColor。swapColor()的局部环境包含一个变量tempColor,该变量只能在这个环境中访问。内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。

2、延长作用域链

JavaScript中没有块作用域的概念,所以if、for等块语句中声明的变量会被添加到当前的执行环境。

for(var i=0; i<10; i++)
{
    doSth(i);
}
alert(i);    //i的值是10

上述代码中的i被添加到全局环境中。在JavaScript中,使用var声明的变量自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在with语句中,最接近的环境就是函数环境。如果没有var声明,则被添加到全局环境。

但是,某些语句可以再作用域链的前端增加一个临时变量,来延长作用链,该临时变量在代码执行后会被删除。

2.1  try-catch语句的catch块。

2.2  with语句。

对于catch语句,会创建一个新的变量对象,该对象包含被抛出的错误对象的声明;对于with语句,会将指定的对象添加到作用域链中。

function buildUrl()
{
    var qs = "?debug=true";
    with(location)
    {
        var url = href+qs;
    }
    return url;
}

在with内部定义了url变量,url自动被添加到函数执行环境中,所以此变量可以作为函数的返回值。

3、查询标识符

挡在某个环境中读取或写入而引用一个标识符时,必须通过搜索来确定标识符代表什么。搜索过程从作用域链的前端开始,向上逐级查询。若在局部环境中找到,则停止搜索,反之,则继续沿作用域链向上搜索,一直追溯到全局环境的变量对象。在全局环境中为找到该标识符,则表示其未声明。

var color="blue";
function getColor()
{
    return color;
}
alert(getColor());  //blue

先在getColor()中找color标识符,如未找到,则向上搜索。

二、垃圾收集

JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存,其原理很简单:找出那些不再继续使用的变量,然后释放其内存。因此,垃圾回收器会按照固定的时间间隔或代码执行中预定的收集时间周期性的执行这个操作。

  1、标记清除

JavaScript中最常用的垃圾收集方式就是标记清除。垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此后再被添加上标记的变量将视为准备删除的变量,因为这些变量已经无法被访问。最后,垃圾收集器完成内存清除工作。IE、FF、Chrome、Safari和Opera的JavaScript引擎都实现了这种方式。

  2、引用计数

引用计数就是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数加1,相反,如果包含这个值引用的变量又取得另外一个值,则这个值的引用次数减1。当引用次数变为0时,垃圾回收器则清除变量所占的空间。但是,这种方式会导致循环引用。

function problem()
{
    var oa = new Object;
    var ob = new Object;
    oa.another = ob;
    ob.anotherObject = oa;
}

oa和ob相互引用,当函数执行完毕时,则这两个对象的引用次数永远不会是0,若重复调用此函数,则会导致大量内存不能回收。所以这种方式并不常用。需要注意的是,在IE中涉及COM对象时,就可能存在循环引用,因为IE的部分对象不是原生的JavaScript对象,例如BOM和DOM是以C++的COM(Component Object Model,组件对象模型)对象形式实现的,COM对象采用的就是引用计数。

var element = document.getElementById("xxx");
var myobject = new Object();
myobject.element=element;
element.some=myobject;

但可以通过手动断开原生JavaScript对象和DOM元素之间的连接来避免循环引用。

myobject.element=null;
element.some=null;

将变量设置为null即可断开变量与之前引用的值之间的连接。当垃圾回收器下次运行时,就会删除这些值并回收他们所占的内存。

原文首发:http://www.ido321.com/1345.html

下一篇:【译】响应式下的下拉菜单

时间: 2024-08-28 00:43:24

DOM笔记(八):JavaScript执行环境和垃圾收集的相关文章

DOM注意事项(八):JavaScript操作环境和垃圾收集

一.运行环境 在约JavaScript对象或this当指向问题,念就是运行环境.即上下文环境.运行环境在JavaScript是一个非常重要的概念.由于它定义了变量或函数有权訪问的其他数据,决定了它们各自的行为.每一个运行环境都有一个与之关联的变量对象,在该环境中定义的全部变量和函数都保存在这个对象中. 全局环境时最外围的一个运行环境.在Web浏览器中,全局环境被觉得是Window对象(兴许笔记中会讨论),因此全部的全局变量和函数都是作为window对象的属性或者方法创建的. 全局运行环境直到应用

JavaScript 执行环境与作用域

前面我说到过,执行环境是js中最为重要的一个概念.执行环境定义了变量和函数有权访问的其他数据,决定了它们各自的行为. 在JavaScript中,每一个函数都表示为一个对象,更确切地说,是Function对象的一个实例.Function对象与其他的对象一样,都拥有可以编程访问的属性,和一系列不能通过代码访问而仅提供了JavaScript引擎存取的内部属性.譬如[[Call]]属性,表示这个对象可以被执行,其中有一个内部属性是[[Scope]],由ECMA-262标准第三版定义. 内部属性[[Sco

JavaScript执行环境

执行环境(Execution Context,也称为"执行上下文")是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其它数据,决定了各自的行为.当JavaScript代码执行的时候,会进入不同的执行环境,这些不同的执行环境就构成了执行环境栈. JavaScript中主要存在三种执行环境: 全局执行环境 JavaScript代码执行的默认环境.通常被默认为window对象,所有的全局变量和函数都作为window对象的属性和方法存在.当执行环境中的代码执行完毕

JavaScript 执行环境及作用域

在JavaScript高级程序设计中,执行环境的定义是:定义了变量或函数有权访问的其他数据,决定了它们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义了所有变量和函数都保存在这个对象中. 其实执行环境就是JavaScript中的作用域 每个函数都有自己的执行环境.当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而且在函数执行完之后,栈将环境推出,把控制权返回之前的执行环境. 内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中任何变量和函数.这些环境

javascript 执行环境,变量对象,作用域链

前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体. 通过上网查资料,特来总结,以备回顾和修正. 要讲的依次为: EC(执行环境或者执行上下文,Execution Context) ECS(执行环境栈Execution Context Stack) VO(变量对象,Variable Object)|AO(活动对象,Active Object) scope chain(作用域链)和[[scope]]属性 EC 每当控制器到达EC

第六章 javaScript执行环境和作用域

这个只是点对于初学者其实大概了解就可以,但是要研究明白javaScript的机制,就是非常必要的,这只是我的一些记录,大家参考即可,如有错误请指出. 执行环境的概念是javaScript一个虚拟的概念,如何定义它呢?它的作用又是什么呢?它是怎么组成的呢? 大家都比较认可的说法:执行环境又称为执行上下文,从实际的表现来看,可以把它理解为由“对象”组成的一个堆栈.既然是堆栈,就是先入后出了. 组成堆栈的对象是什么对象?我没有找到确切的定义,基于我自己的理解,这个对象是一个自定义对象,里边包含有变量.

Javascript执行环境、作用域链

一.执行环境 执行环境(也叫做执行上下文,Execution Context)是Javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,执行环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象,但解析器在处理时会在后台使用它. 全局执行环境是最外围的一个执行环境.根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样.在web浏览器中,全局执行环境被认为是wi

JavaScript执行环境及作用域

执行环境(executin context)是JS中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ,但解析器在处理数据时会在后台使用它. 全局执行环境是最外围的一个执行环境.根据JS实现的宿主环境不同,表示执行环境的对象也不一样.在Web浏览器中,全局执行环境被认为是Window对象,因此所有全局变量和函

《JavaScript高级程序设计》读书笔记 ---执行环境及作用域

执行环境及作用域 执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它.全局执行环境是最外围的一个执行环境.根据ECMAScript 实现所在的宿主环境不同,表示执行环境的