Skip to content

作用域与闭包:词法环境、变量生命周期与封装边界

主题边界

  • 闭包题的本质不是语法嵌套,而是词法环境怎样在函数返回后继续存活。
  • 它同时解释私有状态、回调记忆、模块封装,也解释了内存保留和异步读取。

机制与流程

  • JavaScript 采用词法作用域,变量解析在函数定义时由外层环境决定,而不是调用位置决定。
  • 当内部函数在外部函数返回后仍然可达时,相关词法环境不会被回收。
  • let/const 引入块级作用域和暂时性死区,修复了很多 var 时代陷阱。

关键差异

  • 闭包和 this 不是一回事;闭包取决于词法环境,this 取决于调用方式。
  • 模块作用域、函数作用域和块级作用域分别服务于不同层级的封装边界。

边界条件

  • 闭包本身不是性能问题,问题在于不必要地长期持有大对象、DOM 节点或定时器引用。
  • 循环中的异步回调错误本质上是作用域和时序共同作用的结果。

工程落点

  • 防抖、节流、工厂函数、配置函数和组合式 API 都大量依赖闭包保存状态。
  • 排查内存泄漏时,要特别关注被闭包长期引用的对象。

相关主题