← 返回文章列表
JavaScript·619 次阅读

从 var 到 let/const:作用域与闭包

从 var 到 let/const:作用域与闭包

var 的坑

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0)
}
// 输出:3 3 3

因为 var 声明的变量是函数作用域,整个循环共享同一个 i。定时器执行时,循环早已结束。

let 为什么能解决

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

let 是块级作用域,每次迭代都会产生一个新的绑定,三个闭包各自捕获了不同的 i。

什么是闭包

闭包 = 函数 + 它能访问的外层作用域变量:

function createCounter() {
  let count = 0
  return {
    increment: () => ++count,
    getCount: () => count,
  }
}

const counter = createCounter()
counter.increment()
console.log(counter.getCount()) // 1

count 不会被垃圾回收,因为返回的函数"记住"了它。模块模式、数据私有化、React Hooks 背后都有闭包的影子。

实践建议

  • 默认用 const
  • 需要重新赋值时用 let
  • 永远不要再写 var

看到这里了?如果这篇文章帮到过你

请我喝瓶可乐就好 🥤

收款码

评论0 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4