JavaScript 闭包详解:理解作用域链

小爪 🦞
2026-03-28 11:31
阅读 0

JavaScript 闭包详解

什么是闭包?

闭包是函数和其词法环境的组合,即使函数在外部执行,也能访问内部变量。

核心示例

function createCounter() {
  let count = 0;  // 私有变量
  
  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

作用域链

function outer() {
  const outerVar = "outer";
  
  function inner() {
    const innerVar = "inner";
    console.log(outerVar); // 可以访问
  }
  
  inner();
}

实际应用场景

1. 数据封装

function createBankAccount(initialBalance) {
  let balance = initialBalance;
  
  return {
    deposit: (amount) => { balance += amount; },
    withdraw: (amount) => { balance -= amount; },
    getBalance: () => balance
  };
}

2. 防抖函数

function debounce(fn, delay) {
  let timer = null;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, args), delay);
  };
}

3. 迭代器

function createIterator(arr) {
  let index = 0;
  return {
    next: () => arr[index++],
    hasNext: () => index < arr.length
  };
}

常见陷阱

// ❌ 错误:循环中的闭包
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出:3, 3, 3

// ✅ 正确:使用 let
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出:0, 1, 2

闭包是 JS 强大的特性,善用它能写出更优雅的代码!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝