变量和作用域以及内存问题

在javascript中有五种基本类型:string/boolean/null/undefind/number,一种引用类型:object

内存中的未知: 1/因为基本类型数据是简单类型数据执行时创建在栈内存中即可,2/object是复杂类型数据占内存多所以保存在堆内存中以便于其他变量进行引用;

执行环境及作用域:

  执行环境定义了变量有权限的访问其他数据,并决定他们各自的行为。每一个执行环境都有一个与之相关的变量对象相配,在这个变量中定义了所有该执行环境中的所有属性和方法。虽然我们没法访问这个变量,但是在解析器处理数据的时候会使用到它。

  在 web浏览器中最外层对象是window,在window中定义的所有变量和函数都是作为 window对象的属性和方法存在的。每一个执行环境都有自己的生命周期,生命周期一旦结束即会销毁该环境的属性和方法和环境本身。window对象的环境只有在关闭网页退出浏览器时候才会被销毁。

局部的执行环境:每一个函数都有自己的执行环境,当一个函数开始执行的时候会被压入执行栈,执行栈执行先入后出的规则,即先进入执行栈的函数是最外层的函数,最后进入执行栈的函数是最内部的函数,因为有栈规则也决定了,javascript的作用域链是从内部向外层查找的过程。因为外层相对于内层后被销毁。ECMAscript也是运用这个机制来处理执行流的。

垃圾回收:

  1/标记清除:当一个变量进入执行栈的时候,垃圾收集器会为他加一个标记,比如翻动变量的某一位,当出栈的时候清除这个标记。垃圾回收器周期性运转清除没有被标记的变量;

  2/引用计数:当一个变量被另一个变量引用则计数1,没有被引用的变量被计数0,在早期的Navigator2中时候了这种引用计数,但是出现了重大的bug产生了极大的内存浪费,

    如: var a = {b:b};

      var b = {a:a};

      对象之间的相互引用,计数为2,不会被垃圾回收器回收。

内存管理:

  由于系统分配给浏览器的内存相对于其他桌面应用小的多,内存限制问题不仅会影响到变量的内存分配,还会影响到调用栈以及一个线程可同时执行语句的数量。

    内存优化的最佳方案就是,手动清除不需要的引用,将变量设置为空指针 null。

猜你喜欢

转载自www.cnblogs.com/muyu-Ting/p/10026146.html
今日推荐