返回

javascript 中的神秘词法作用域

前端

词法作用域
javascript 采用词法作用域,也称为静态作用域。这意味着变量的作用域由其声明位置决定,而不是由其执行位置决定。换句话说,变量的作用域由代码的结构来确定,而不是由代码的运行时行为来确定。

词法作用域的一些特点:

  • 变量在定义时就确定了其作用域,而不是在执行时。
  • 内部作用域可以访问外部作用域的变量,但外部作用域不能访问内部作用域的变量。
  • 作用域是嵌套的,每个作用域都有自己的变量。
  • 当离开一个作用域时,该作用域的变量就会被销毁。

让我们看一个代码示例:

// 全局作用域
var x = 10;

function foo() {
  // 局部作用域
  var y = 20;
  console.log(x); // 10
  console.log(y); // 20
}

foo();

console.log(x); // 10
console.log(y); // ReferenceError: y is not defined

在这个示例中,全局作用域和局部作用域是嵌套的。局部作用域可以访问全局作用域的变量 x,但全局作用域不能访问局部作用域的变量 y。当离开局部作用域时,局部作用域的变量 y 就被销毁了。

对比动态作用域

词法作用域和动态作用域是两种不同的作用域类型。在动态作用域中,变量的作用域由其执行位置决定。这意味着变量的作用域可以随着代码的执行而改变。

动态作用域的一些特点:

  • 变量的作用域由其执行位置决定,而不是由其声明位置决定。
  • 内部作用域可以访问外部作用域的变量,但外部作用域不能访问内部作用域的变量。
  • 作用域不是嵌套的,变量的作用域可以随着代码的执行而改变。
  • 当离开一个作用域时,该作用域的变量不会被销毁。

让我们看一个动态作用域的代码示例:

// 全局变量
var x = 10;

function foo() {
  // 局部变量
  var y = 20;
  function bar() {
    // 内部变量
    var z = 30;
    console.log(x); // 10
    console.log(y); // 20
    console.log(z); // 30
  }
  bar();
}

foo();

在这个示例中,全局作用域、局部作用域和内部作用域是嵌套的。内部作用域可以访问局部作用域的变量 y 和全局作用域的变量 x,局部作用域可以访问全局作用域的变量 x,但全局作用域不能访问局部作用域和内部作用域的变量。

总结

javascript 采用词法作用域,这使得 javascript 的作用域更加明确和可预测。词法作用域可以帮助你更好地组织代码,并避免变量命名冲突。