JavaScript 中的词法作用域

2025年4月19日 | 阅读 4 分钟

作用域指的是程序中变量可以被访问和修改的区域。这是所有编程语言中的一个核心概念,有助于高效地使用受控变量。通常,作用域的唯一目的是控制变量的可见生命周期;因此,避免意外的覆盖或干扰。

作用域类型

编程语言中存在的主要作用域类别包括词法作用域、全局作用域以及局部作用域、嵌套作用域和块作用域。

JavaScript 中的词法作用域是什么?

通常用来表达词法作用域的术语是静态作用域,即在编译期间定义,并依赖于程序结构的作用域。简单来说,就是词法作用域,即变量在代码中声明的地方。它在源代码中的位置决定了其词法作用域,并且在任何运行过程中都不会改变。

词法作用域这个术语用来描述变量和函数的可访问性,这取决于它们在源文件中的位置。可以说,变量和函数的作用域存在于不同的级别,例如

  1. 全局作用域: 在任何函数或块外面声明的全局作用域变量可以在程序中的任何位置使用。
  2. 局部作用域: 在函数或块里面声明的局部作用域变量只能在该特定函数或块中访问。
  3. 嵌套作用域: 内部函数也可以使用在函数内部定义的变量。
  4. 块作用域: 使用 letconst 声明的变量只能在定义它们的块内访问,例如在循环或 if 语句内。
Lexical Scope in JavaScript

在上面的图表中,很明显,由于词法作用域,函数可以访问其父作用域直到全局作用域的所有变量。但是没有作用域可以访问该作用域内函数中定义的任何变量。

本文将介绍 JavaScript 中的词法作用域,以及许多说明其工作原理的代码示例。

全局作用域

在任何函数或块外面声明的变量具有全局作用域。因此,它可以在程序的任何地方访问。它也可以在函数内部访问。

示例: 在下面的示例中,变量 name 在任何函数或块外部声明。因此,它属于全局变量类别。因此,示例函数可以访问 name 变量并在控制台打印 “Hello JavaTpoint”

代码

输出

Lexical Scope in JavaScript

局部作用域

函数或特定块内声明的变量具有局部作用域。这意味着它的可访问性仅限于该特定函数或块。

示例: 在下面的示例中,变量 name 在 “main” 函数内声明为局部变量。它可以在函数内使用,但任何在函数外部的访问都会导致 “ReferenceError”

代码

输出

Lexical Scope in JavaScript

嵌套作用域

此功能允许在一个函数内声明一个变量:然后,从内部函数中可以访问在外部函数中声明的变量。这种现象称为嵌套作用域。

示例: 在下面的示例中,内部函数建立在外部函数内。内部函数可以使用在父外部函数中定义的 name 变量,从而在控制台输出 “Hello WEBSITE”

代码

输出

Lexical Scope in JavaScript

块作用域

ES6 中引入关键字 letconst 允许为变量分配块作用域。在特定代码块(例如 if 语句或 for 循环)内声明的变量,进一步限制了只能在该特定块内访问。

示例: 在下面的示例中,变量 message 具有块作用域。它只能在 if 块的范围内访问;但是,任何尝试在該特定塊外部访问它的操作都会引发 “ReferenceError”

代码

输出

Lexical Scope in JavaScript

结论

这总结了 JavaScript 中的词法作用域。JavaScript 中的词法作用域允许嵌套函数中定义的变量或函数访问其包含或父函数中的变量和函数;但是,反之则不然。这是因为作用域链的设计方式是仅向上移动,从子到父,反之则不然。内部函数与其父函数保持词法链接;因此,它可以访问在内部函数创建时在其父作用域中声明的变量和函数。


下一个主题JavaScript Findall