每个函数也有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入环境栈(也叫调用栈)中。当函数执行后,栈将其环境弹出,把控制权交给之前的执行环境。
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();
上述代码首先会创建一个全局的执行环境,变量对象即该环境中包含的变量和函数,在这里是 baz
,bar
,foo
。
然后 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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可免费下载
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)**
[外链图片转存中…(img-TgwSjUll-1713838625443)]
最后
分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可免费下载
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。