React useEffect 中清理函数的真实执行时机:一个被忽略的闭包陷阱
最近在排查一个线上问题时,发现一个组件的定时器在卸载后仍然在跑,导致内存泄漏和额外的请求。代码看起来很正常:useEffect 里启动了 setInterval,返回了 clearInterval。但问题出在依赖数组上——依赖项变化时,清理函数确实执行了,可是它清理的是旧闭包里的定时器 ID,而新一次 effect 又创建了新的定时器。更隐蔽的是,当组件快速重新渲染时,清理函数和新的 effect 之间有一个微妙的执行顺序,稍不注意就会让旧定时器“复活”。这篇文章不打算重复 useEffect 的基本用法,而是从一次真实的调试经历出发,拆解清理函数的执行时机、闭包捕获的变量、以及依赖数组为空和...