JS基础(二)
分类:javascript
JS知识点2
1.基础数据类型底层执行原理
var a = 12
var b = a
b = 13
console.log(a) // 13
执行原理如下:
2.引用数据类型底层执行原理
- 对象
var a = {n: 12}
var b = a
b['n'] = 13
console.log(a.n) // 13
执行原理如下:
var a = {n: 1}
var b = a
a.x = a = {n: 2}
console.log(a.x) // undefined
console.log(b) // { n: 1, x: { n: 2 } }
执行原理如下:
JS运算符优先级
- 函数
创建函数:
- 开辟一个堆内存(以字符串形式存放函数内的代码)
- 声明函数的作用域(scope)即当前创建函数时所处的上下文(EC(G))
函数执行:
- 生成一个私有上下文(EC(FN1))、AO(FN1) 私有变量对象,进栈
- 生成函数的作用域链 <EC(FN1), EC(G)>(<当前函数私有上下文, 当前创建函数时所处的上下文>)
- 初始化this、arguments
- 形参赋值: 声明一个形参变量,把传递过来的实参赋值给形参
- 变量提升
- 代码执行(把创建函数时,在堆内存中存储堆代码字符串拿出来变为代码,执行)
- 出栈释放
代码执行: 私有上下文中代码执行,遇到变量,首先看是否是自己的“私有变量”,如果是,则操作自己的,不是,则给予作用域链向上查找,看是否为上级上下文中私有的,还不是则继续向上查找,一直找到全局上下文EC(G)为止。这种查找过程,被称作 【作用域链查找机制】
var x = [12, 23]
function fn(y) {
y[0] = 100
y = [100]
y[1] = 200
console.log(y)
}
fn(x) // [100, 200]
console.log(x) // [100, 23]
执行原理如下:
- 私有变量y为传入实参的地址:0x000001
- y[0] = 100, 则0x000001中索引为0的值改为100
- y = [100], [100]是一个数组, 开辟一个新的堆内存0x000002, 私有变量 y 的指向改变
- y[1] = 200, 则0x000002中索引为1的值改为200
3.浏览器垃圾回收机制
GC: 浏览器的垃圾回收机制(内存释放机制)
- 加载页面,形成一个全局的上下文,只有在页面关闭的时候,上下文才会被释放
- 函数执行会形成一个私有的上下文,进栈执行;当函数中代码执行完成,大部分情况下,形成的上下文都会被出栈释放掉
「堆内存释放」
- 标记引用(Google)
- 浏览器在空闲或者指定时间内,查看所有的堆内存,把没有被任何东西占用的堆内存标记,在回收程序运行时释放掉
- 引用计数(IE)
- 创建了堆内存,被占用一次,则浏览器计数+1,取消占用计数-1,当记录的数字为0时,内存释放(此方法会出现循环引用问题)