EC 执行上下文
VO 变量对象,存储执行上下文的变量、函数声明、函数参数
AO 变量对象:
1 变量初始化阶段(顺序填充 函数参数、函数声明、变量声明)
2 代码执行阶段
VO的对##象分成了两个阶段来执行
- 一个是初始化阶段:初始化阶段的话所有的变量都会按照undefined的来走;如果是函数的VQ的话,传入的参数会按照传入值放##置
- 一个是代码执行阶段:执行阶段的数据会按照赋##值的过程来更新VQ里面的值
VO的对象分成了两个阶段来执行
- 一个是初始化阶段:初始化阶段的话所有的变量都会按照undefined的来走;如果是函数的VQ的话,传入的参数会按照传入值放置
- 一个是代码执行阶段:执行阶段的数据会按照赋值的过程来更新VQ里面的值
VO的对象分成了两个阶段来执行
- 一个是初始化阶段:初始化阶段的话所有的变量都会按照undefined的来走;如果是函数的VQ的话,传入的参数会按照传入值放置
- 一个是代码执行阶段:执行阶段的数据会按照赋值的过程来更新VQ里面的值
VO的对象分成了两个阶段来执行
- 一个是初始化阶段:初始化阶段的话所有的变量都会按照undefined的来走;如果是函数的VQ的话,传入的参数会按照传入值放置
- 一个是代码执行阶段:执行阶段的数据会按照赋值的过程来更新VQ里面的值
VO的对象分成了两个阶段来执行
- 一个是初始化阶段:初始化阶段的话所有的变量都会按照undefined的来走;如果是函数的VQ的话,传入的参数会按照传入值放置
- 一个是代码执行阶段:执行阶段的数据会按照赋值的过程来更新VQ里面的值
函数表达式是不会放在VO里面的,所以在外部拿不到这些变量名
VO(Variable Object)按照如下顺序填充:
1.函数参数(若未传入,初始化该参数值为undefined)
2.函数声明(若发生命名冲突,会覆盖)
3.变量声明(初始化变量值为undefined,若发生命名冲突,会忽略。)
感觉可以怎么理解呢,就是首先就是一个指定上下文的功能,这个具体什么功能还要先介绍完AO和VO。
和C一样,你再编译的时候引入库的时候是要把一些函数先声明调用一波的。就是说会先创建一个函数的声明,然后会对变量进行声明,而且要注意的是每一个函数都会自己创建一个VO然后嵌套在global的VO里面,然后会对变量进行声明。所以顺序就是1、函数2、变量,而且变量一开始会被写成undefined
然后就是一些关于明名的问题,如果明名的函数与前面重复,就会覆盖,如果变量重复就会忽略。
你这个代码在编译的时候就会进行上面的操作,创建一个树或者说一个json对象(不可见)。先找到所有的函数、变量,然后再执行其他的操作,所以命名重复时候会出现变量丢失。
VO填充顺序
注意 第一航alert(x) // alert出的是一个function
这里竟然用了VO['c'] = 10!! (视频左上角)
这里讲了讲为什么函数名不能在函数自身之外使用
注意这里 函数名被赋值为1以后 再打印函数名 会输出1 而如果执行函数名(这里是func()) 那么会报错(环境Node12.13)
视频里的意思是 如果参数名和函数内的局部函数声明的函数名一致(重叠) 函数名会覆盖参数名 意思是变量名代表函数名而不是参数名
注意这里右上角的第三条
3.变量声明(... 会忽略!!!)
然后 视频里的意思是 函数的声明 会在变量声明之前 只不过 如果在变量声明时 发生与函数声明重叠 会忽略重复的变量声明
函数中的"VO" 也就是"激活对象"AO
注意下方的 [[global]].String(10)
VO(globalContext) === [[global]] <<==这是"全局执行上下文" 注意这里的[[global]]
执行上下文对象 VO
注意里面对函数声明在对象VO中的记录(右下): <ref to function>
变量初始化阶段
执行上下文概念
11111
VO填充顺序:
函数参数(若未传入,初始化该参数值未undefined)
函数声明(若发生命名冲突,会覆盖)
变量声明(初始化变量值为undefined,若发生命名冲突,会忽略)
注意:函数表达式不会影响VO
VO 变量对象,是一个抽象概念中的对象,存储执行上下文中的1.变量 2.函数声明 函数参数
变量初始化执行顺序
var e= function _e(){}这样写_e将不会被声明,与var e=function (){}是一样的。
VO填充顺序:
全局上下文与函数执行时的执行上下文。