Appearance
作用域与闭包:词法环境、变量生命周期与封装边界
主题边界
- 闭包题的本质不是语法嵌套,而是词法环境怎样在函数返回后继续存活。
- 它同时解释私有状态、回调记忆、模块封装,也解释了内存保留和异步读取。
机制与流程
- JavaScript 采用词法作用域,变量解析在函数定义时由外层环境决定,而不是调用位置决定。
- 当内部函数在外部函数返回后仍然可达时,相关词法环境不会被回收。
let/const引入块级作用域和暂时性死区,修复了很多var时代陷阱。
关键差异
- 闭包和
this不是一回事;闭包取决于词法环境,this取决于调用方式。 - 模块作用域、函数作用域和块级作用域分别服务于不同层级的封装边界。
边界条件
- 闭包本身不是性能问题,问题在于不必要地长期持有大对象、DOM 节点或定时器引用。
- 循环中的异步回调错误本质上是作用域和时序共同作用的结果。
工程落点
- 防抖、节流、工厂函数、配置函数和组合式 API 都大量依赖闭包保存状态。
- 排查内存泄漏时,要特别关注被闭包长期引用的对象。