返回

JavaScript中的作用域、作用域链与闭包详解

前端

JavaScript的作用域
作用域是指代码中声明变量或函数的地方,该变量或函数在作用域内有效。JavaScript 中有两种作用域:全局作用域和局部作用域。

1. 全局作用域

全局作用域是最基本的作用域,覆盖整个脚本。在这个作用域内声明的变量或函数可以在脚本的任何地方访问和使用。

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

function showX() {
  console.log(x);
}

showX(); // 输出:10

2. 局部作用域

局部作用域是指在函数或代码块中声明的变量或函数的作用域。局部作用域内的变量或函数只能在该函数或代码块内访问和使用。

// 局部作用域
function add(a, b) {
  var sum = a + b;
  console.log(sum);
}

add(1, 2); // 输出:3
console.log(sum); // 报错:ReferenceError: sum is not defined

JavaScript的作用域链

作用域链是指从当前执行的函数开始,一直到全局作用域的变量和函数作用域的链条。当一个变量或函数在局部作用域中找不到时,JavaScript就会沿着作用域链向上查找,直到找到该变量或函数。

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

function outer() {
  var y = 20; // 局部作用域

  function inner() {
    var z = 30; // 局部作用域

    console.log(x); // 输出:10
    console.log(y); // 输出:20
    console.log(z); // 输出:30
  }

  inner();
}

outer();

JavaScript的闭包

闭包是指可以访问其所在的函数的变量的作用域。闭包在 JavaScript 中非常重要,因为它允许你在函数外访问和使用函数内的变量和函数。

// 闭包
function counter() {
  var count = 0;

  return function() {
    count++;
    console.log(count);
  };
}

var counter1 = counter();
counter1(); // 输出:1
counter1(); // 输出:2

var counter2 = counter();
counter2(); // 输出:1

总结

作用域、作用域链和闭包是 JavaScript 中的基本概念,是理解 JavaScript 运行机制的关键。深刻掌握它们可以让你写出更优雅、更强大的代码。