如何确定JavaScript中变量的作用域?

发表时间: 2023-10-23 16:45

在 JavaScript 中,变量的作用域是由作用域链(Scope Chain)来确定的。作用域链是指变量在执行期间访问的作用域的链式结构。

JavaScript 中的作用域分为全局作用域和局部作用域(函数作用域和块级作用域)。

  1. 全局作用域:全局作用域是在代码中所有函数之外声明的变量的作用域。在浏览器中,全局作用域通常是指 window 对象。全局作用域中的变量可以被程序中的任何部分访问。
  2. 函数作用域:函数作用域是在函数内部声明的变量的作用域。每当函数被调用时,都会创建一个新的函数作用域。函数作用域中的变量只能在函数内部访问,外部作用域无法访问函数内部的变量。
  3. 块级作用域:在 ES6 引入了块级作用域,使用 let 和 const 关键字声明的变量具有块级作用域。块级作用域是指由 {} 括起来的代码块内部声明的变量的作用域。在块级作用域中声明的变量只能在块级作用域内部访问,外部作用域无法访问块级作用域中的变量。

当访问一个变量时,JavaScript 引擎会先在当前作用域中查找该变量,如果找不到,则会向上一级作用域继续查找,直到找到该变量或达到全局作用域。这样形成的链式结构就是作用域链。作用域链的顶端是当前执行上下文的变量对象,最底端是全局作用域的变量对象。

使用 var 声明的变量在函数作用域中具有提升(Hoisting)的特性,即变量的声明会被提升到函数的顶部,但赋值操作仍然保留在原来的位置。而使用 let 和 const 声明的变量则不会有提升的特性,并且具有块级作用域。