0.搞清三个概念:预加载与执行期;js变量存储(栈区与堆区);js变量的类型(引用类型(对象)与基本数据类型);

JS在预编译时,对于函数的预加载方面,浏览器仅仅选择编译声明式函数(function Fn())进行预加载,对赋值式函数不予加载(有待考证)

预编译阶段,JS不会对函数内部的变量进行加载,会在执行阶段加载。(假想有待考证)

JS中变量的定义在内存中包括三个部分:

    变量标示 (比如上图中的Str,变量标示存储在内存的栈区)

    变量值 (比如上面中的Str的值souvenir或者是obj1对象的指向堆区地址,这个值也是存储在栈区)

    对象 (比如上图中的对象1或者对象2,对象存储在堆区)


1.变量初始化过程

  先预加载,后执行。

  预加载(预编译):  挂在变量到栈区中去,不进行赋值。

          预编译期JS会对本代码块中的所有声明的变量和函数进行处理(类似与C语言的编译),但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。
  执行阶段:赋值并执行js语句。

2.js变量存储原理
  栈区:存放变量名(变量标识符)和变量值(仅存放基本类型值或者引用对象的地址)
  堆区:存放真实对象(被引用对象)的值。

//Demo:请仔细思考其过程
clear();
var obj = {name:"johnny"};
var v = 34;
///////////////
var testObj = obj;//此时:testObj与obj指向堆区同一个被引用对象,二者数据保持同步一致
var testV = v;//此时:testV = 34
testObj.name = "jake";
//////////////
var testObjProperty = obj.name;
//testObjProperty = "jake";
testObjProperty.name = "Mary";
//obj.name = "jake";//未改变
obj.age = 30;
var newObjProperty = obj.teacher;//赋值:空地址
obj.teacher = {"name":"唐建梅"};//testObj与obj增加的属性均同步
testObj.teacher //undefined

  

3.引用文献

  3.1 javascript函数执行前期变量环境初始化过程(https://www.cnblogs.com/huzhiming/archive/2012/12/07/2806849.html)

  3.2 JavaScript变量存储浅析(二)(http://www.cnblogs.com/souvenir/p/4969565.html)

  3.3 JavaScript变量存储浅析(一)(https://www.cnblogs.com/souvenir/p/4969399.html)

  3.4 javascript运行机制之执行顺序详解(http://blog.csdn.net/chen_zw/article/details/18502937)

  3.5 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)ued.ctrip.com/blog/how-browsers-work-rendering-engine-html-parsing-series-ii.html

JavaJavaScript之内存与变量初始化的更多相关文章

  1. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  2. C++变量初始化问题

    初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念. 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间的当前值擦除,用一个新值代替 ...

  3. 调整static变量初始化顺序的一个办法

    // wrap the LaunchDir variable in a function to work around static/global initialization order stati ...

  4. C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性

    http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...

  5. uboot环境变量初始化

    一.环境变量概述 1.环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改. 启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境 ...

  6. 【细说Java】Java变量初始化顺序

    Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...

  7. java与C++变量初始化的对比

    java尽力保证:所有变量在使用前都能得到恰当的初始化 ①函数/方法局部变量的初始化 在C/C++中,变量的初始化还是得依赖于程序员的自觉性.对于函数局部变量,编译器不会为基本类型赋予默认初始值,新手 ...

  8. C++的变量初始化

    C++中变量的初始化有很多种方式,如:默认初始化,值初始化,直接初始化,拷贝初始化,列表初始化. 1.默认初始化:默认初始化是指定义变量时没有指定初值时进行的初始化操作. 如:int a:这些变量被定 ...

  9. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检 ...

随机推荐

  1. js語句

    js語句就是告訴瀏覽器要做什麼: js代碼就是js語句序列: js代碼塊就是{}包括的,函數就是一個代碼塊的典型例子: js注釋:單行注釋://,多行注釋:/**/ js對大小寫敏感: js語句可以不 ...

  2. mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

    mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

  3. Linux环境变量PATH

    查看PATH:echo $PATH以添加mongodb server为列修改方法一:export PATH=/usr/local/mongodb/bin:$PATH//配置完后可以通过echo $PA ...

  4. 使用nexus搭建maven私服教程详解

    私服是什么 私服,私有服务器,是公司内部Maven项目经常需要的东东,不总结一下,不足以体现出重视.Nexus是常用的私用Maven服务器,一般是公司内部使用.下载地址是http://www.sona ...

  5. python列表和元组操作

    列表 列表(list)是python以及其他语言中最常用到的数据结构之一.Python使用中括号[ ]来解析列表.列表是可变的(mutable)—可以改变列表的内容. 定义列表 names = ['m ...

  6. BZOJ3505 CQOI2014数三角形(组合数学)

    显然可以用总方案数减掉三点共线的情况.对于三点共线,一个暴力的做法是枚举起点终点,其间整点数量即为横纵坐标差的gcd-1.这样显然会T,注意到起点终点所形成的线段在哪个位置是没有区别的,于是枚举线段算 ...

  7. EF 跨库查询

    原因:最近公司项目,遇到一个ef跨库查询的问题.(只是跨库,并不是跨服务器哈) 主要我们的一些数据,譬如地址,城市需要查询公共资料库. 但是本身我的程序设计采用的是ef框架的.因此为这事花费了1天时间 ...

  8. webapi返回泛型给easyui

    由于之前遇到的easyui调用webapi的问题. 参见 :http://blog.csdn.net/hanjun0612/article/details/51144991 所以就考虑,封装一个泛型用 ...

  9. 覆盖的面积 HDU - 1255(扫描线求面积交)

    题意: 就是扫描线求面积交 解析: 参考求面积并.... 就是把down的判断条件改了一下..由w > 0 改为 w > 1 同时要讨论一下 == 1 时  的情况, 所以就要用到一个临时 ...

  10. 【POI 每日题解 #4】 [POI2008]MAF-Mafia

    [POI2008]MAF-Mafia 很容易看出是拓扑 但不容易想出来怎么做[可能是我太菜 首先 入度为零的人是肯定死不了的 接着 我们分成环和链分析 对于一个链 最多的情况就是顺着一个个开枪 最后剩 ...