JavaScript 中什么是闭包?请解释一下闭包的使用场景。

闭包是指有权访问另一个函数作用域中的变量的函数。简单来说,闭包使得函数内的变量在函数执行后仍然存在。

闭包的使用场景有:

  1. 实现私有变量:通过闭包可以实现私有变量,只能在闭包内访问。
function makeCounter() {
  let count = 0;
  return function() {
    return count++;
  };
}

let counter = makeCounter();
counter(); // 0
counter(); // 1

这里 count 是私有变量,只能在闭包内访问。

  1. 实现缓存:通过闭包的方式,可以实现简单的缓存机制。
function makeCache() {
  const cache = {};
  return function(key) {
    if (cache[key]) {
      return cache[key];
    } else {
      let value = key + ' value';
      cache[key] = value;
      return value;
    }
  }; 
}

const getValue = makeCache();
getValue('a'); // 'a value'  
getValue('a'); // 返回缓存的值 'a value'
  1. 实现柯里化:通过闭包可以实现柯里化,即将接收多个参数的函数变换成接收一个单一参数的函数。
function curry(func) {
  return function(a) {
    return function(b) {
      return func(a, b);
    };
  };
}

function sum(a, b) {
  return a + b; 
}

let curriedSum = curry(sum);
curriedSum(1)(2); // 3

所以闭包的主要用途是封装变量,实现私有变量、缓存、柯里化等高级功能。理解闭包的工作原理和作用,是精通 JavaScript 的基础。