什么是JavaScript作用域与作用域链?

222 阅读2分钟

作用域分为全局作用域、函数作用域、块级作用域。

作用域是什么?

  • 其实可以我们可以这样理解,作用域就是一套规则,js遵循这样的一套规则来定义存储变量,查找变量。

js引擎会对js代码进行一个编译,过程中编译器会对代码进行一个词法分析,语法分析,生成可执行代码。当然除此之外,作用域也会做一些事情,就是去收集所有声明的标识符组成的一系列查询,并且确定当前的代码对这些标识符的访问权限!这些内容在《你不知道的JavaScript》上卷中有提到。

  • 上面提到作用域制定了一系列的访问规则,那么这些规则就会产生这样的一个效果,在不同的作用域下,访问是需要有权限的,起到一个隔离变量的作用!

全局作用域、函数作用域、块级作用域

  • 这些不同种的作用域其实也只是在编译阶段作用域实施的不同的规则造成的差异

全局作用域

  • 在任何地方都能访问的对象。比如我们使用的window对象,前端开发中,你几乎可以在任何地方你都可以访问到

函数作用域

  • 声明在函数内的一些变量只能在该函数内访问,当然有一些特殊情况,如我们经常挂在嘴边的问题闭包

块级作用域

  • 一般,在一对{}或者在函数内部用letconst来声明

什么是作用域链?

  • 按照我的理解,其实作用域就是一个个对象,作用域之间是可以自由嵌套的,作用域对象之间的引用形成的链式结构我称之为作用域链