likes
comments
collection
share

JS中的作用域

作者站长头像
站长
· 阅读数 15

在JavaScript中,作用域是指变量、函数和对象的可访问性和可见性范围。它定义了在代码中的哪些部分可以访问定义的变量、函数或对象。


JavaScript中有几种主要类型的作用域:

  1. 全局作用域:全局作用域是在整个代码中都可访问的范围,变量在全局作用域中声明的话,可以被代码中的任何部分访问。全局作用域中声明的变量可以通过使用var关键字进行声明,或者在顶层(函数外部)直接进行声明,例如:
var globalVariable = 10;

function globalFunction() {
  console.log(globalVariable); // 可以访问全局变量
}

console.log(globalVariable); // 10

  1. 局部作用域:局部作用域是在特定代码块(如函数或块语句)中声明的范围,变量在局部作用域中声明的话,只能在该作用域内部访问。局部作用域可以通过函数或代码块(使用letconst关键字)创建。

  1. 函数作用域:在JavaScript中,每当你声明一个函数时,都会创建一个新的函数作用域。函数内部声明的变量仅在函数内部可见,并且在函数外部不可访问。这意味着函数内的变量与函数外的变量具有不同的作用域。例如:
function exampleFunction() {
  var functionVariable = "Function Scope";
  console.log(functionVariable); // 可以访问函数内的变量
}

exampleFunction(); // "Function Scope"
console.log(functionVariable); // 错误,无法访问函数内的变量

  1. 块级作用域:块级作用域是在代码块中声明的范围,例如if语句、for循环和switch语句等。在ES6中,可以使用letconst关键字来声明块级作用域变量。块级作用域中声明的变量只能在该块内部访问,超出该块后将不再可见。例如:
if (true) {
  let blockVariable = "Block Scope";
  console.log(blockVariable); // 可以访问块级作用域变量
}

console.log(blockVariable); // 错误,无法访问块级作用域变量

  1. 模块作用域:模块作用域是在ES6模块中引入的概念。在模块中声明的变量具有模块级别的作用域,这意味着它们对模块内部可见,但对模块外部不可见,除非明确导出或导入。通过使用export关键字导出变量或函数,并使用import关键字将其引入其他模块,可以在模块之间共享和访问变量。例如:
// module.js
export let moduleVariable = 30;

// main.js
import { moduleVariable } from './module.js';
console.log(moduleVariable); // 可以访问导入的模块变量


在JavaScript中,除了上述提到的主要作用域类型外,还存在一些其他的作用域相关概念:

  1. 词法环境:词法环境是JavaScript引擎内部用于存储和查找变量的数据结构。它包含变量的标识符和与之关联的值,以及对父级词法环境的引用。每个函数和块级作用域都会创建一个新的词法环境。
  2. 闭包:闭包是指函数与其词法环境的组合。闭包允许在函数内部创建和访问私有变量,并且这些变量在函数执行完毕后仍然保留其值。
  3. 具名函数表达式的作用域:在具名函数表达式中,函数名只在函数内部可见,而在外部是不可访问的。这意味着函数名称在函数内部形成了一个新的作用域。