旅游网站建设经费预算免费建站
- 全局 / 私有变量
- 作用域的概念
- 作用域链 scopeChain 的概念
- 作用域链 scopeChain 的形成
- 函数执行步骤
- 作用域链查找机制
全局 / 私有变量
全局变量:在全局上下文
EC(G)中的全局变量对象VO(G)中,存储的变量
私有变量:在函数执行形成的私有上下文
EC(XXX)中的变量对象AO(XXX)中,存储的变量
包括:
- 当前函数执行形成的上下文中:
声明过的变量或者函数
- 函数定义的
形参变量
作用域的概念
当前函数[[Scopes]]
= 当前函数创建时候所在
的上下文
简单来说:函数的作用域取决于当前函数创建时候的上下文,哪个上下文创建,作用域就是谁
作用域链 scopeChain 的概念
scopeChain:<当前EC
, 函数[[scope]]
>
查找变量时,按照该链式关系找(先找自己上下文
,自己没有,按照作用域链
向上级作用域找)
包含:
- 当前形成的上下文
- 当前函数所对应的
scope
作用域
作用域链 scopeChain 的形成
作用域链是在函数执行
的时候形成的
函数执行步骤
- 创建私有上下文EC(有存放私有变量的变量对象
AO
) - 进栈执行(把全局上下文放在后面)
- 初始化
作用域链
scopeChain:<当前EC,函数[[scope]]> - 初始化
this
指向 - 形参赋值(包括初始化
arguments
) - 变量提升
- 代码执行
- 执行完
可能出栈
(也可能不出栈)
作用域链查找机制
在当前上下文中,代码执行的过程中遇到一个变量时:首先看它是否是私有
的
- 如果是私有的,接下来的所有操作,都是操作自己
- 如果不是私有的,则按 作用域链 scopeChain 进行查找,
在哪个上下文找到,当前变量就是谁的
3 .一直找到全局上下文为止 - 如果找到 EC(G) 都找不到:
a.获取变量
会直接报错
b.设置值
,则直接给 GO(window) 加属性
<script type="text/javascript">function a(){function b(){function c(){}} }
</script>
// 以a函数的作用域为例
a defined a.[[scope]]-->0:GO
a doing a.[[scope]]-->0:aAO1:GOb defined b.[[scope]]-->0:aAO1:GOb doing b.[[scope]]-->0:bAO1:aAO2:GO
c defined c.[[scope]]-->0:bAO1:aAO2:GO
c doing c.[[scope]]-->0:cAO1:bAO2:aAO3:GO
经典例题1
经典例题2
参考
作用域图解