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