执行环境,变量对象及作用域链

每个函数也有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入环境栈(也叫调用栈)中。当函数执行后,栈将其环境弹出,把控制权交给之前的执行环境。

javascript 函数的执行有一个调用栈,当调用一个函数的时候这个函数就会被加入到调用栈中。拿之前的 浅析 javascript 中 this 的指向 ( 箭头函数 ) 关于调用位置的那段代码来举例

function baz(){

// 当前调用栈是:global->baz

var a = 1;

console.log( “baz” );

bar();

}

function bar(){

// 当前调用栈是:global->baz -> bar

console.log( “bar” );

foo();

}

function foo(){

// 当前调用栈是 global->baz -> bar -> foo

console.log( “foo” )

}

baz();

上述代码首先会创建一个全局的执行环境,变量对象即该环境中包含的变量和函数,在这里是 bazbarfoo

然后 baz() 执行,这个时候,baz() 的被压入环境栈,成为当前的执行环境,此时 baz() 中的变量对象变为函数执行时的活动对象为 arguments(每个函数执行时都会创建)和 a。

执行 bar()。这个时候,bar() 被压入环境栈,成为当前执行环境。以此类推

3 变量对象

我们知道了变量对象是执行环境中包含定义的所有变量和函数,那么它的创建过程是怎么样的呢,来看一个例子

console.log(foo); // undefined

console.log(bar()); // 2

var foo = 1;

function bar(){

console.log(2);

}

那么为什么是这样呢?

首先变量对象创建的时候若为函数,则会先创建 arguments 对象。然后将函数声明(这里与函数表达式区别)添加到变量对象中,最后将变量添加到变量对象当中。但是此时变量的值全都是 undefined。只有执行到赋值语句以后,变量才有值。

函数表达式即 var 声明的函数,这样的函数被当做变量,在赋值之前也不能进行操作,不存在函数声明提升的过程。

什么是活动对象呢?

未进入执行环境之前,变量对象中的属性都不能访问!但是进入执行环境之后,变量对象转变为了活动对象,里面的属性都能被访问了,然后开始进行执行阶段的操作。所以活动对象实际就是变量对象在真正执行时的另一种形式。

4 作用域链

那么什么是作用域链呢

对于每一个执行环境,都会创建一个与之关联的作用域链。每个执行环境的作用域链的前端,始终都是该执行环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即 arguments 对象(这个对象在全局执行环境是不存在的)。作用域链中的下一个变量来自于包含(外部)环境,即环境栈中的上一个执行环境。而再下一个变量对象则来自于下一个包含环境。这样,一直延续到全局执行环境。全局执行环境的变量对象始终都是作用域链的最后一个对象。

怎么理解呢

还是以上面那个例子,首先创建了全局的执行环境,这个执行环境包含一个指向作用域链的指针,用代码表示如下

globalExecutionContext = { // 全局执行环境

scopeChain: ScopeChain // 作用域链

}

ScopeChain = { // 作用域链

0: globalVaribalObject // 全局变量对象

}

globalVaribalObject = {

baz: function(){…},

bar: function(){…},

foo: function(){…}

}

全局执行环境包含作用域链,作用域链里面包含了全局执行环境下的变量对象,这个变量对象里面包含了那个函数声明。

接下来,当执行环境进入到 baz() 中,

bazExecutionContext = { // baz 执行环境

scopeChain: ScopeChain // 作用域链

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可免费下载

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)**

[外链图片转存中…(img-TgwSjUll-1713838625443)]

最后

分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可免费下载

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值