从 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 条
还没有评论,来抢沙发~