加载中...

| 语言特性依赖 | 词法作用域 + 一等公民函数 |
| 相关概念 | 作用域链、垃圾回收、IIFE |
| ECMAScript 规范 | Environment Record(ES5+) |
JavaScript 采用词法作用域(静态作用域),变量查找规则在代码编写时就固定,不随调用位置变化。当一个内层函数被返回到外部使用时,它携带了一个对外层作用域的引用(即闭包),该引用阻止垃圾回收器回收那些变量。经典场景:用 IIFE(立即调用函数表达式)在 ES6 以前封装模块,避免全局污染。jQuery 的源码就大量依赖这一技巧。[1]
闭包常见于:防抖/节流函数通过闭包保存计时器 ID;React Hooks 的 useState setter 通过闭包捕获当前 fiber;记忆化(memoize) 把缓存对象关在函数内部。需要注意的是,闭包持有的变量不会被 GC,若在循环中大量创建且不释放,会造成内存泄漏。经典的 var + for 循环 + setTimeout 陷阱(全部打印最终值而非各自迭代值)是闭包与 var 函数作用域共同作用的结果,用 let 块级作用域或 IIFE 均可解决。

| 语言特性依赖 | 词法作用域 + 一等公民函数 |
| 相关概念 | 作用域链、垃圾回收、IIFE |
| ECMAScript 规范 | Environment Record(ES5+) |
登录 后参与讨论
暂无讨论,来发表第一条评论吧