Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.2k views
in Technique[技术] by (71.8m points)

关于react绑定事件,闭包传参内存泄漏问题

先上代码

function InputForm({ onSubmit = () => {} }) {
  const [data, setData] = useState({
    task: "",
    price: "",
    type: "",
  });

  function formChangeHandler(field) {
    return (e) => {
      setData({
        ...data,
        [field]: e.currentTarget.value,
      });
    };
  }

  return (
    <input
      required
      placeholder="任务"
      value={data["task"]}
      onChange={formChangeHandler("task")}
    ></input>
  );
}

如示例所示, 我在onChange事件接受了一个参数, 返回一个listener, 这个listener依赖外部的field, 虽然return了函数, 但我还是认为不妥, 我认为还是存在内在泄漏风险.

是否改成

onChange={(e) => formChangeHandler(e, "task")}

会好一些?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

不会。
高阶函数是很常见的做法,前端耳熟能详的防抖、节流通常都靠高阶函数来实现,不会有大的问题。
闭包导致内存泄漏其实是早期 IE 存在的问题。
另外,通常只有大规模数据的处理、频繁调用函数、长时间运行等场景需要关注内存泄露问题,一般情况下有几个对象的内存没回收,可以忽略。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...