You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

useEffect执行cleanup后isCanceled仍为false的原因咨询

useEffect中cleanup修改变量后,下一次执行仍为初始值的原因

问题重现

期望控制台输出:

start of useEffect
false
cleanup
start of useEffect
true

实际控制台输出:

start of useEffect
false
cleanup
start of useEffect
false

对应代码:

useEffect(() => {
  console.log("start of useEffect")
  let isCanceled = false;
  console.log(isCanceled);

  return () => {
    isCanceled = true;
    console.log("cleanup");
  };
});

核心原因:变量作用域与渲染周期的独立性

每次组件重新渲染时,useEffect的回调函数都会被重新执行一遍,函数内部声明的isCanceled是每次执行时全新创建的变量,和上一次渲染周期里的isCanceled没有任何关联。

你在cleanup函数里修改的isCanceled = true,只是修改了上一次渲染时创建的那个isCanceled变量,但当下一次渲染触发useEffect执行时,会重新声明一个新的isCanceled并赋值为false,所以下一次输出的还是初始值。

简单说,两次useEffect执行里的isCanceled是两个完全独立的变量,修改其中一个不会影响另一个。

关于参考文章的补充说明

你看的文章里,isCanceled的作用是在异步操作的回调中判断是否取消任务——比如发起请求后,组件卸载或者重新渲染时,通过cleanup把上一次的isCanceled设为true,这样后续异步回调触发时,就能通过这个变量判断是否要放弃处理结果。这种场景下,isCanceled是被异步回调闭包捕获的上一次变量,和下一次渲染的变量无关,所以能正常工作。


内容的提问来源于stack exchange,提问作者lma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:55:08