JS运行机制

JS运行机制一

  1. 当浏览器(它的内核\引擎)渲染和解析JS的时候, 会提供一个供JS代码运行的环境, 我们把这个环境称为全局作用域(global/window scope).
  2. 代码自上而下执行(在这之前还有一个变量提升阶段):
    • 基本数据类型的值会存储在当前作用域下(栈):
      • 例如 var a = 12 其实是有三步操作:
        1. 首先开辟一个空间存储 12
        2. 在当前作用域中声明一个变量 a (var a)
        3. 让声明的变量和存储的值 进行关联(把存储的12赋值给a, 赋值操作叫做定义)
      • 基本数据类型(也叫值类型), 是按照值来操作的: 相互之间的赋值是把原有的值复制一份, 放到新的空间, 和原来的值没有关系
        • 例如 var a = 12; var b = a;
    • 引用数据类型的值不能直接存储到当前作用域(因为存储的内容可能过于复杂), 需要开辟一个新的空间来存储(堆):
      • 例如 var obj1 = {a: 100} 的操作步骤:
        1. 首先开辟一个新的内存空间(堆), 把对象中的键值对依次存储, 为了保证后面可以找到这个空间, 此空间有一个16进制的内存地址
        2. 声明变量 obj1
        3. 让变量和空间地址关联在一起(把空间地址赋值给变量)
      • 引用数据类型不是按值来操作, 它操作的是空间的引用地址: 相互之间的赋值是把原来的空间地址赋值给新的变量, 原来的空间并备有被克隆, 还是同一空间. 这样就会出现多个变量关联的是相同的空间, 相互之间会存在影响.
        • 例如 var obj1 = {a: 100}; var obj2 = obj1;
  3. 栈内存: 提供JS代码运行环境, 所有基本类型值都会直接在栈内存开辟一个位置进行存储
  4. 堆内存: 用来存储引用类型中的信息的值, 对象存储的是键值对, 函数存储的是代码字符串

练习一:

var obj = {
    n : 10,
    m : obj.n * 10
};
console.log(obj.m);     // Uncaught TypeError: Cannot read property 'n' of undefined


// 1. 形成一个全局作用域(栈内存)
// 2. 代码自上而下执行:
//     1. 首先开辟一个新的堆内存(AAAFFF111), 把键值对存储到堆内存中(n:10, m:obj.n*10), 此时堆内存信息还没存储完成, 空间地址也没有给obj, 因此obj是undefined, obj.n<=>undefined.n, undefined是基本类型值没有属性所以报错.

原创文章,作者:tipak,如若转载,请注明出处:http://www.myqqu.com/note/javascript_lessons/jsyunxingjizhi.html