返回

漫谈 JavaScript 中的作用域

见解分享

在 JavaScript 中,作用域是指在变量声明的代码段之外是不可见的。我们可以将 JavaScript 作用域分为三种类型:函数作用域、块级作用域和词法作用域。

函数作用域

函数作用域是指在函数内声明的所有变量在函数体内始终是可见的,可以在整个函数的范围内使用及复用。

例如,我们有以下代码:

function sayHello() {
  var message = "Hello, world!";
  console.log(message);
}

sayHello(); // 输出: Hello, world!

在这个例子中,变量 message 在函数 sayHello 中声明,因此它在函数体内是可见的。当我们调用函数 sayHello 时,变量 message 的值被输出到控制台。

块级作用域

块级作用域是指在变量声明的代码段之外是不可见的。块级作用域是由 ES6 中引入的 letconst 实现的。

例如,我们有以下代码:

if (true) {
  let message = "Hello, world!";
  console.log(message); // 输出: Hello, world!
}

console.log(message); // 报错: ReferenceError: message is not defined

在这个例子中,变量 messageif 语句块中声明,因此它在 if 语句块内是可见的。当我们执行 if 语句块时,变量 message 的值被输出到控制台。但是,当我们尝试在 if 语句块之外访问变量 message 时,我们会得到一个错误,因为 messageif 语句块之外是不可见的。

词法作用域

词法作用域是指一个函数可以访问其父函数的作用域中的变量。

例如,我们有以下代码:

function outer() {
  var message = "Hello, world!";

  function inner() {
    console.log(message); // 输出: Hello, world!
  }

  inner();
}

outer();

在这个例子中,函数 inner 可以访问其父函数 outer 中的变量 message。当我们调用函数 outer 时,函数 inner 也被调用,并且变量 message 的值被输出到控制台。

总结

函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。块级作用域是指在变量声明的代码段之外是不可见的。词法作用域是指一个函数可以访问其父函数的作用域中的变量。