Skip to content

什么叫做作用域?

在JavaScript中,一个变量的定义和调用,都会在一个固定的范围中。这个范围我们称之为作用域(这个定义来源于JavaScript重难点实例精讲)

也可以理解为当前执行上下文中能访问的变量、函数的集合.你可以把作用域当成一个独立的区域,在这个区域里面的变量不会外泄和暴露。

什么叫做作用域链?

每一个执行上下文访问到的变量包括自身执行上下文、父级执行上下文...一直到全局执行上下文,这样产生的关系就叫做作用域链

那作用域发挥着什么用处?

隔离变量,不会造成变量污染问题,在不同的作用域下,相同的变量命名不会冲突

作用域分为哪几种?分别是啥意思

  • 全局作用域

1、在最外层定义的变量或者函数,就属于全局作用域

2、未定义直接使用的变量属于全局作用域

3、window的属性也是全局作用域,如window.a = 2 那么a也相当与一个全局变量

  • 函数作用域

顾名思义,以函数形式定义的

  • 块级作用域

这是属于es6新增的功能,let和const.在他们声明之外的作用域是无法访问的。

特点:

1、无法进行变量提升

2、不能再同一个作用域中重复定义

3、在循环中的引用。函数内部的变量i和循环体中的变量i不在一个作用域

js
for(let i = 0;i < 3; i++){
    let i = 6
    console.log(i)
}
console.log(i)
1
2
3
4
5

自由变量了解吗?

当前作用域没有定义的变量就叫做自由变量

执行上下文是个什么啥?

执行上下文(Execution Context)其实就是对JS执行环境的一种抽象概念。可以说JS代码的执行,一定是在执行上下文之中

执行上下文分为哪几种类型?

  • 全局执行上下文

这是最基础也是默认的执行上下文,它主要做两件事,第一:创建一个window对象;第二,将this的值指向window。注:一个程序中只能有一个全局执行上下文

  • 函数执行上下文

当一个函数执行的时候就会为其创建一个执行上下文,函数执行上下文可以有多个,但是只有当函数执行或者说被调用的时候,才会形成函数执行上下文

  • eval执行上下文

由于eval函数执行代码的速率相比其它的慢一些,且容易受到代码攻击,所以这里给个网址,大家可以在这里找到答案

什么叫做执行上下文栈?

执行上下文栈,也叫执行栈,有的也叫做调用栈。它是一种先进后出后进先出的数据结构。用于存储当前执行阶段创建的所有执行上下文。

当js引擎执行我们js代码的时候,首先会形成一个全局执行上下文,并将其压入到执行栈中,当执行到一个个函数的时候,就会形成一个个函数上下文,并将这一个个函数上下文压入到执行栈。就像弹夹一样,将一颗颗子弹压入弹夹,最后一颗压入弹夹的子弹会最先射出。需要注意的是,处于活跃的执行上下文环境只能同时有一个,就像子弹一次只能打一发。

js引擎会执行位于执行栈栈顶的执行上下文,当该上下文执行结束后,将会被弹出,程序将引导流程处理下一个执行上下文。以此类推,当最后一个执行栈执行完毕,也就是全局执行上下文执行完,就会被退出执行栈销毁,程序结束

所有的JS代码执行都像上面这样吗?当代码执行完毕,执行上下文也都销毁。

答案是否定的,有种特殊情况,代码执行完,执行上下文环境却不能完全的销毁,这就是闭包。

闭包

个人理解:闭包发生在函数嵌套里面,在一个函数中访问另一个函数的变量,这样就产生了闭包。而闭包的作用就是延长变量的生命周期,避免被垃圾回收

官方解释:一个拥有很多变量和绑定了这样变量执行上下文表达式,通常是一个函数(是不是很拗口😂但我真的是在书上看到的)

闭包拥有两个特点:

1、函数拥有外部变量的引用,在函数返回时,该变量仍处于活跃状态

2、闭包作为一个函数返回的时候,其执行上下文不会被销毁,仍处于执行上下文环境中

闭包概念.png

AO、VO

VO:Variable Object,变量对象。储存了执行上下文中定义的变量和函数声明,不过我们不能访问

AO:Activation Object,活动对象。在没有执行当前环境之前,变量对象中的属性都不能访问!但是进入执行阶段之后,变量对象转变为了活动对象,所以活动对象和变量对象其实是一个东西,只是处于执行环境的不同生命周期。

在JS执行代码的时候,两者都用来帮助js在变量引用的时候寻找变量

参考资料:

https://juejin.cn/post/6844903682283143181#heading

https://juejin.cn/post/6844903797135769614#heading

https://segmentfault.com/a/1190000012362182

《JavaScript重难点实例精讲》