JS之函数的底层运行机制

83 阅读2分钟

内存知识

GO:全局对象「堆内存中分配的一块空间 0x000」,存储浏览器的内置API

EC(G):全局执行上下文

VO(G):全局变量对象:存储全局上下文中声明的变量的{排除基于var/function声明的}

AO:私有变量对象,用于存储当前上下文中声明的私有变量

console.log(a); 
//首先会到VO(G)查找,看是否为全局变量,如果不是,则再去GO中找,看是否为全局对象的一个属性,如果还不是,则报错 Uncaught ReferenceError: a is not defined
console.log(window.a); //直接去GO中查找是否存在a这个成员,如果没有则不会报错,值是undefined

浏览器开发者工具调试

Script:VO

Scope:GO

函数运行机制

创建函数

@1 在堆内存中分配一个16进制内存地址的空间

@2 把函数中的内容存储到空间中

+声明函数作用域【在哪个上下文创建的,作用域就是谁

+把函数体中的代码当作字符串存储起来 “代码字符串”

+作为对象,存储它的键值对[name:fn.length:1形参个数]

@3 把空间地址放在栈中,供变量引用

函数执行

实参,传递的是变量的值(原始值或地址)

@1 形成一个全新的私有上下文(EC(fn)),然后进栈执行。在私有上下文中,有一个AO(fn)私有变量对象,用来存储当前上下文中声明的变量

@2 函数在代码执行之前需要做的事情:

+初始化作用域链<自己私有上下文,函数的作用域{上级上下文}>

  • 初始化this

  • 初始化arguments实参集合

  • 形参变量赋值

  • 变量提升

@3代码开始自上而下执行

执行中遇到某个变量,首先看是否为自己的私有变量【形参是私有的、当前上下文声明过的变量是私有的,这些私有变量都在 AO(fn)

  • 是自己私有的,则操作是自己的,和外界变量没有关系【保护作用】

  • 若不是是自己私有的,则向上级上下文查找....,一直没有,找到全局位置,这种查找机制,称之为作用域链查找机制

@4 代码执行完,出栈释放【也可能不释放】