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

作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问

2 执行环境

执行环境,顾名思义,是执行的时候才会被创建的环境。如果代码没有执行,则不会创建执行环境。执行环境又分为全局执行环境和函数执行环境。

首先,有一个全局执行环境,根据 ECMAScript 实现所在的宿主环境不同,表示执行环境的对象也不同。在 web 浏览器中即 window 对象,因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。全局执行环境直到应用程序退出,例如关闭网页或浏览器才会被销毁。

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

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(){…}

}

全局执行环境包含作用域链,作用域链里面包含了全局执行环境下的变量对象,这个变量对象里面包含了那个函数声明。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

img

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

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

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

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取

前端面试题宝典

前端校招面试题详解

试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取**

[外链图片转存中…(img-sGoFJVUK-1713319657403)]

[外链图片转存中…(img-T6nq4FA7-1713319657404)]

[外链图片转存中…(img-aAr3UD9O-1713319657404)]

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值