1.全局变量:在全局上下文EC(G)的全局变量对象VO(G)存储的变量
-
1.1 在某一个上下文中创建函数,除了开辟堆内存和赋值之外,还多做了一件事情:给当前函数设置作用域链[scope]=当前函数创建时候所在的上下文
-
1.2 执行函数的时候
- 创建新的私有的上下文EC(存放私有变量的变量对象AO)
- 进栈执行
- 初始化作用域链 scopeChain:当前EC,函数[scope]
- 初始化this指向
- 形参变量赋值(包含初始化arguments)
- 变量提升
- 代码执行
- 执行完可能会出栈(也可能不出栈)
2.私有变量:在函数执行形成的私有上下文EC(X)中的变量对象中的AO(X)存储的变量
- 当前上下文中声明过的变量或者函数 都会存储到AO(X)中
- 函数定义的形参变量,也会存储到当前上下文的AO(X)中
3.作用域链查找机制
在当前上下文中,代码执行的过程中遇到一个变量,首先看他是否为私有的
-
如果是私有的,接下来的所有操作,都是操作自己的,和别人没有关系;
-
如果不是私有的,则按照scopeChain作用域链进行查找,在那个上下文中找打,当前变量就是谁的。...一直找到全局上下文为止
-
如果找到EC(G)都找不到:如果是获取变量值就会报错,如果是设置值,相当于给GO加属性
console.log(a, b);//=>undefined var a = 12, b = 12;//=>13 function fn() { console.log(a, b);//=>undefined 12 var a = b = 13; //=>var a=12; b=12; 只有第一个带VAR,第二个不带VAR console.log(a, b);//=>13 } fn(); console.log(a, b);//=>12 13