JS基础(二)

吐槽君 分类:javascript

JS知识点2

1.基础数据类型底层执行原理

var a = 12
var b = a
b = 13

console.log(a) // 13
 

执行原理如下:

1.png

2.引用数据类型底层执行原理

  • 对象
var a = {n: 12}
var b = a
b['n'] = 13

console.log(a.n) // 13
 

执行原理如下:

2.png

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 } }
 

执行原理如下:

1.png
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

2.png

3.浏览器垃圾回收机制

GC: 浏览器的垃圾回收机制(内存释放机制)

  • 加载页面,形成一个全局的上下文,只有在页面关闭的时候,上下文才会被释放
  • 函数执行会形成一个私有的上下文,进栈执行;当函数中代码执行完成,大部分情况下,形成的上下文都会被出栈释放掉

「堆内存释放」

  • 标记引用(Google)
    • 浏览器在空闲或者指定时间内,查看所有的堆内存,把没有被任何东西占用的堆内存标记,在回收程序运行时释放掉
  • 引用计数(IE)
    • 创建了堆内存,被占用一次,则浏览器计数+1,取消占用计数-1,当记录的数字为0时,内存释放(此方法会出现循环引用问题)

回复

我来回复
  • 暂无回复内容