javascript变量内存分析

对应有道云笔记地址(有道云上排版更优):http://note.youdao.com/noteshare?id=4540ded2b3c421a90c1230953184910a&sub=573E4064D0FD49F6BB876E3BF6C228A3

/**
* Created by: yel
* Date: 2018.03.09
* from: https://www.cnblogs.com/ys-ys/p/5300189.html
*/

目的:

1、了解javascript中内存机制,让我们能更好的分析我们写的代码在执行中,内存的相关情况 。进而分析和规避内存相关的问题
2、更好的理解闭包

 

 

堆内存和栈内存

javascript中内存也分 “堆内存” 和“栈内存”


栈内存:效率更高,能申请的空间较小
堆内存:效率更低,能申请的空间更大

在js的5种基础类型中(undefined、null、boolean、string、number),这5种类型(undefined、null、boolean、string、number)是分配的栈内存空间。而js中的引用类型(array、function、object),给其引用地址分配栈内存空间,给引用地址指向的值则分配的是堆内存空间。
eg:
  var a = 1; //为a分配的是栈内存 a->1 。
  var b = a; //传递的值为字符串,所以,为b分配新的栈内存 b->1

  var obj1 = {
    age:1
  };//obj是对象,所以,为obj1分配栈内存存放引用地址(指向新开辟的堆内存),同时,分配新的堆内存存放{age:1}

  var obj2 = obj1; //为obj2分配新的栈内存用于存放引用地址,这个引用地址指向之前分配的堆内存。

  obj2.age = 2;//当我们通过这种方式去访问并修改堆内存中的值时,obj.name同样会发生改变。

 

内存中储存的数据的生命周期
1.当对象将被需要的时候为其分配内存
2.使用已分配的内存(读、写操作)
3.当数据不在被需要的时候,释放存储这个对象的内存

 

Q:那么JavaScript是如何判断我们的数据是否需要的呢?

对于存在栈内存中的数据,会和作用域结合起来,超出作用域后,其栈内存将被释放。

对于堆内存而言,堆内存中的数据都是通过对应的栈内存中存放的地址来进行读写的,所以,一个堆内存中的数据对应一个和多个指向他的栈内存的存放的引用地址,一旦没有栈内存中的引用地址指向他时,他将被释放(引用计数)
eg1:
  var obj = {name:1};
  obj = null; //此时{name:1}已被释放  

  直此:我们再理解下闭包
  闭包:能够读取其他函数内部变量的函数
eg2:
  function test(){
    var a = 1;
    function child(){
      console.log(a);
    }
    return child;
  }
  test()();

eg3:
  function child(){
    console.log(a);
  }
  function test(){
    var a = 1;
    var child1 = child;
    return child;
  }

 

posted @ 2018-10-09 17:13  鳯訡  阅读(999)  评论(0编辑  收藏  举报