一、运行环境

在约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()的局部环境。作用域链例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA0Mzg0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

最外围是全局环境对象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具有自己主动垃圾收集机制,运行环境会负责管理代码运行过程中使用的内存。其原理非常easy:找出那些不再继续使用的变量,然后释放其内存。

因此。垃圾回收器会依照固定的时间间隔或代码运行中预定的收集时间周期性的运行这个操作。

  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

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

DOM注意事项(八):JavaScript操作环境和垃圾收集的更多相关文章

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

    一.执行环境 在有关于JavaScript对象或者this的指向问题时,脱离不了的另外一个概念就是执行环境,即上下文环境.执行环境在JavaScript是一个 很重要的概念,因为它定义了变量或函数有权 ...

  2. 使用原生 JavaScript 操作 DOM

    原文:https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/ 微软官方放弃了 IE10-,所以现在可以放心使用 ...

  3. JavaScript 操作DOM对象

    1)JavaScript  操作DOM對象 1.DOM:是Document  Object  Model 的缩写,及文档对象模型 2.DOM通常分为三类:DOM Core(核心).HTML-DOM 和 ...

  4. 使用JavaScript操作DOM节点元素的常用方法(创建/删除/替换/复制等)

    getElementById(id)这是通过id来访问某一元素,最常用的之一,例:<html><body><div id="myid">test ...

  5. JavaScript 操作 DOM 常用 API 总结

    文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...

  6. Python javascript操作DOM

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...

  7. javaScript操作DOM对象(看三遍,敲三遍,写三遍! 不会你找我)!!

    DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API 使用javaScript操作DOM对象通常分为三类:1.DOM CORE        2.HTM ...

  8. 第四章 JavaScript操作DOM对象

    第四章   JavaScript操作DOM对象 一.DOM操作 DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API接口,1988年,W3C发布了第一级 ...

  9. 你所不了解的javascript操作DOM的细节知识点(一)

    你所不了解的javascript操作DOM的细节知识点(一) 一:Node类型 DOM1级定义了一个Node接口,该接口是由DOM中的所有节点类型实现.每个节点都有一个nodeType属性,用于表明节 ...

随机推荐

  1. axis2之webservice

    Axis2之webservice超详细教程 Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的 ...

  2. 2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客

    2.2.2  胸腰差和胸臀差的应用_米人NOONE_新浪博客 腰差和胸臀差的应用(2009-06-16 19:24:57)转载▼标签:校园         前面已经对这两个概念作了简单的讲解.这两个概 ...

  3. 微信小程序 app.json 配置

    我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包含了所有配置选项的简单配置app.json : { " ...

  4. 去除express.js 3.5中报connect.multipart() will be removed in connect 3.0的警告

     1 $ node app.js  2 connect.multipart() will be removed in connect 3.0  3 visit https://github.com/s ...

  5. 每日一小练——Eratosthenes 筛选法

    上得厅堂.下得厨房,写得代码.翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Eratosthenes筛选法 内容: 求质数是一个非常普遍的问题,通常不外乎用数去除.除到不尽时,给定的数就是质数.可是 ...

  6. 如何用SQL SERVER 2005连接SQL SERVER 2008

    原先使用sql server 2005数据库,后来由于工作需要升级为sql server 2008 开发版,升级过程很简单,基本没有什么问题 下面主要说说,如何使用sql server 2005 st ...

  7. VMware下桥接设置

    操作环境 主机:Win7 X86 SP1 虚拟机:VMware station 8 虚拟机里的系统:Fedora 15 环境上,不管什么系统,什么版本的虚拟机,使用上都是大同小异的,毕竟核心是不变的. ...

  8. JS高级——闭包

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. 远程访问数据库查询数据量一大就Hang

    最近刚为客户升级了一套Oracle Database,一切进展顺利,眼看就要顺利验收时,发现有部分客户端软件连接新版本数据库时会Hang,问题非常诡异. 系统环境如下 升级前的环境OS:Windows ...

  10. 用Struts2标签实现Map的迭代

    最近在做一个论坛,论坛通常分为几个主版块,每一个主版块下面又有几个子版块. 想不出更好的展现方式,最终采用了如下的方法来实现: 用一个Map,HashMap或者Treemap承载之.一个子版块名字对应 ...