您的位置:首页 > Web前端 > JavaScript

javascript变量类型、执行环境和作用域、垃圾回收

2016-07-07 17:24 281 查看
ECMAScript 变量
包含两种不同的数据类型的值,基本类型和引用类型。

基本类型就是指简单的数据段,引用类型值指那些可能由多个值构成的对象。

基本类型赋值,从一个变量赋值给另外一个变量,实质上,就是把这个值复制一份到另外一个变量副本中。而引用类型赋值,从一个变量到另外一个变量复制引用类型的值,复制的实际是指针,而两个变量最终指向的是同一个对象。

包含引用类型值得变量实际上包含的并不是对象本身,而是一个指向对象的指针。

关于变量传值有两种,一个是按值传递,一个是引用传递,值得注意的是,javascript这个语言中的变量就是按值传递。

执行环境和作用域
Js的执行环境定义了变量和函数访问其他数据的权利,决定他们各自的行为。

全局执行环境是最外层的一个执行环境,根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样。在WEB浏览器中,全局执行环境被认为window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。某个执行环境中的所有代码执行完毕后,该环境会被销毁,因此保存在环境中的所有变量和函数定义也会被销毁。(如果是全局执行环境,把改应用程序关闭或退出才会销毁。)

每个函数都有自己的执行环境,当执行流进入一个函数时候,函数的环境就会被推入一个环境栈中,而在函数执行完后,栈将其环境弹出,把控制权返回给之前的执行环境。每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链。

当代码在一个环境中执行的时候,会创建变量对象的一个作用域链。(作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。)

值得注意的是,其他语言,有花括号封闭的代码成为块作用域,而javascript是没有块作用域的。因此,在javascript的for中,for外部的能访问for内部里面的属性。(javascript 的函数是有自己的作用域的。)

当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用链的最前端开始,一直向上逐级搜索。如果在局部变量中能搜索到该变支付,搜索过程停止,变量就绪。如果在局部变量中找不到,就沿作用链一直向上搜索。

垃圾回收机制
javascript具有自动垃圾收集机制,就是说,执行环境(浏览器)会复制管理代码执行过程中使用的内存。在C或C++之类的语言中,开发人员的一项基本的任务就是手工跟踪内存的使用情况。
而在JS中,我们再也不用关心内存使用问题,所需的内存和分配和无用的内存回收完全实现自动管理。

垃圾回收机制通常有两个策略
1.标记清除
javascript最常用的垃圾收集方式就是标记清除。意思是,垃圾收集器在运行的时候,会给内存中所有的变量都加上相对于的标记。然后,他会去除环境中的变量以及被破坏环境中的变量引用的变量标记。之后再被加上标记的变量将被认为准备删除的变量,原因是环境中的变量已经无法访问这些变量。最后垃圾收集器完成内存清除工作,销毁那些带有清除标记的变量并回收他们所占用的内存空间,换句话来说,就是给当前不适用的值加上标记,然后再回收其内存。、。

现在IE、Firefox、Opera、Chrome、Safari等大部分主流的浏览器的Javascript实现使用的都是标记清除的垃圾收集策略。

2.引用计数
这个是跟踪记录背个变量值被引用的次数。把次数少的值进行销毁和内存回收。之前网景公司有使用,但是遇到一个很严重的问题,就是循环引用,所以这个策略现在不太常见。

IE有一部分的对象不是原生的的javascript对象,而是COM对象,而COM对象的垃圾收集机制是采用技术策略。因此,及时IE的javascript引擎是使用标记清除策略来实现,但是javascript访问COM对象时,仍然才有引用技术原理策略,所以,仍然存在循环引用的问题。
为解决上述问题,IE9把BOM和DOM对象都转成Javascript对象,这样就能避免两种垃圾收集算法并存的问题,也消除了内存泄漏的现象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: