js深入之词法作用域和动态作用域

February 08, 2022

文章导读

https://github.com/mqyqingfeng/Blog/issues/3

静态作用域vs动态作用域

JavaScript采用词法作用域,也就是静态作用域。 词法作用域:函数的作用域在函数定义的时候就决定了 动态作用域:函数的作用域在函数调用的时候才决定

什么是变量提升

var变量会发生“变量提升”的现象,即变量可以在声明之前使用,值为undefined。let/const声明变量的一定要在声明之后使用,否则报错。

为什么存在变量提升

主要是因为在执行上下文创建阶段,函数声明和var声明的变量已经被赋予了一个值,var声明被设置了undefined,函数声明为自身,let 和 const 设置为未初始化。作用域创建时两者初始化的值不同。

暂时性死区

在代码块内,使用let/const声明变量之前,该变量都是不可用的。本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取。只有执行到声明变量,才可以获取和使用该变量。

什么是作用域链

当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级执行上下文的变量对象中查找,一直到全局上下文的变量对象,也就是全局对象。这种由多个执行上下文的变量对象构成的链表叫做作用域链。


Profile picture

百事可乐

Let it snow, let it snow, let it snow