内存知识
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 代码执行完,出栈释放【也可能不释放】