预编译(回顾)

文章详细阐述了浏览器如何形成执行环境栈和全局执行上下文,解释了变量提升和函数声明的规则,包括全局对象GO与全局变量对象VO的区别,以及带var和不带var声明变量的不同。同时,提到了防止变量提升的方法和在条件判断中的处理策略。

浏览器运行机制

  1. 为了能够让代码执行,浏览器首先会形成一个执行环境栈 ECStack(Execution Context Stack)
  2. 有了栈内存代码就可以自上而下的执行
  3. 开始执行全局下的代码,形成一个全局执行上下文 EC(GLOBAL 简写 GO )
  4. 对应代码会在自己所属的执行上下文中执行,而环境有一个存放变量的地方
    VO(Virtual Object) 全局变量对象 AO(Activeion Object) 私有变量对象

变量提升机制

  1. 变量声明提升
  2. 函数声明定义整体提升
console.log(a)              var a
console.log(func)     ===>  function func (){
var a = 10                    var b
function func () {            console.log(b)//undefined
  console.log(b)              b = 20
  var b = 20                  console.log(b)//20
  console.log(b)             }
}                           console.log(a)//undefined
func()                      console.log(func)//f func(){ ... }
console.log(a)             a = 10
                           func()
                           cosnole.log(a)//f func(){...}
===============================================================
GO:{
  a: undefined -> 10
  func:f (){...}
}
AO:{
  b: undefined -> 20
}

私有变量提升步骤

  1. 创建AO对象(私有执行期上下文)
  2. 找形参和变量声明,将变量和形参作为AO属性名,值为 undefined
  3. 将实参与形参统一
  4. 函数声明定义整体提升
function func (b) {
  console.log(b);//3          
  console.log(test);//f test(){...}
  var b = 20;
  console.log(b);//20
  function test (){}
}
func(3)
===========================
AO:{
    b: undefined -> 3 -> 20
    test: f(){...}
}

例题链接

全局对象 GO 和全局变量对象 VO的区别

全局对象GO: ==》 对象
浏览器默认自带很多JS调取使用的内置API,这些属性方法都在GO中存储
浏览器端 GO === window node端 GO === global 通用 globalThis
全局变量对象VO: ==》栈内存
当全局代码执行过程中,声明的变量都存储在VO

带var和不带var的区别

全局执行上下文中

带var:基于var创建变量,会给VOGO中各存储一份
不带var:不创建变量,而是设置GO属性

全局执行上下文中

带var:基于var创建变量,给AO中存储
不带var:

  1. 沿着作用域链(scoped-chain)往上走,查看是谁的变量
  2. 如果全局也没找到,则设置GO属性(window)

系统输出顺序

  1. 首先是否为全局变量 GO,是则输出全局变量的值
  2. 是否为全局对象的属性 VO,是则输出全局对象的属性
  3. 报错 a is not defined
var a = 1
window.a = 2; // 会把VO中变量a也改掉
console.log(a); // 2

防止函数的变量提升

函数表达式,提升在函数执行时的不严谨性

var a = function (){}

变量提升在条件判断下的处理

禁止在判断或循环中声明函数
在这里插入图片描述

console.log(a)//undefined
if(true){
  a=3
  console.log(a)//3
  function a(){}
  console.log(a)//3
}
console.log(a)//3
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值