变量对象/变量提升

纸飞机 发表于 2021/10/19 01:14:50 2021/10/19
【摘要】 JS代码执行时要先创建执行上下文 (Execution Context),然后在上下文中执行代码。其中创建上下文阶段会生成与之 关联的变量对象(Variable Object),它的 作用是保存上下文中定义的变量声明与函 数声明。变量提升的实质就是变量对象的 生成,其生成规则如下: 全局上下文的变量对象 : (GlobleObjec...

JS代码执行时要先创建执行上下文 (Execution Context),然后在上下文中执行代码。其中创建上下文阶段会生成与之 关联的变量对象(Variable Object),它的 作用是保存上下文中定义的变量声明与函 数声明。变量提升的实质就是变量对象的 生成,其生成规则如下:

全局上下文的变量对象 :

(GlobleObject, GO)

(1) 打开网页创建GO对象:GO{ }。

(2) 在全局中寻找函数声明作为GO属性。

(3) 在 全 局 中 寻 找 变 量 声 明 作 为 GO 的 属 性,并赋值undefined。若GO中存在同名 属性,则忽略继续查找,不做任何覆盖。

函数上下文的变量对象 :

(VariableObject, VO)

与GO的差别在于多一个参数分析。

(1) 创建上下文时即函数执行前一瞬间生成 一个变量对象VO: VO{}。

(2) 检 查 函 数 参 数 : 将 函 数 的 形 参 添 加 为 VO属性,默认值为undefined。接收函数 的 实 参 ( 如 有 传 参 ) , 并 覆 盖 原 值 undefined。

(3) 检查函数声明:将函数声明添加为VO 属性,若VO中存在同名的属性,则覆盖其 属性为该函数。

(4) 检查局部变量:若VO中不存在与该局 部变量同名的属性,则添加属性到V0并赋 值为undefined。若VO中已存在同名的属 性,则不做任何覆盖。 所以如果遇到同名属性,优先级是:函数声明〉函数参数〉局部变量声明

(5) 之后进入代码执行阶段,变量对象会被 激活成活动对象(Activation Object, AO ) ,这 时 候 对 象 上 的 各 种 属 性 才 能 被 访 问。此时会进行变量赋值,函数引用,以 及顺序执行其他代码。VO与AO是同一个对象的两个不同周期的叫法。


  
  1. function fn (a) {
  2. var a = 11
  3. function a () {
  4. console.log('我优先级最高')
  5. }
  6. console.log(a)
  7. }
  8. fn(10) //11

讲解: 


  
  1. 1. 形参a传过来,VO对象创造属性 VO.a = undefinded。
  2. 2. 结合实参,VO.a = 10
  3. 3. 查找函数声明,a被赋值为一个函数体,即由a = 10 变为 a = Function
  4. 4. 查找变量声明,它本应该在VO对象内创造a属性并赋值为undefinded,但a属性已经存在,不做改动。
  5. 5. 开始执行函数代码,遇到var a = 11这一句,a被赋值为11,即a = Function变为 a = 11

文章来源: root181.blog.csdn.net,作者:前端纸飞机,版权归原作者所有,如需转载,请联系作者。

原文链接:root181.blog.csdn.net/article/details/119847424

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。