首页 > 解决方案 > 在这种特殊情况下(通过共享调用),Javascript 会发生什么?

问题描述

Javascript 使用共享调用,但我有一些与 React 相关的问题。

在函数内部设置状态(setState Hook 或 Class State)会发生什么?例如:

const [myState, setMyState] = useState(null);

const foo = () => {
   const bar = {'prop': 1};
   setMyState(bar);
}

foo();

javascript 如何跟踪函数内部设置的状态值,据我所知,原因是bar在执行后死亡foo

setState 是复制传递的值还是我遗漏了什么?

标签: javascriptreactjspointersjavascript-objectspass-by-reference

解决方案


价值观不会死。值永远存在于内存中,只要没有人过来将它们擦掉(垃圾收集器)。但是,只要您在内存中引用了该值,垃圾收集器就不会触及它。现在bar包含对您案例中对象的引用。当您调用时,setMyState您传递了引用,因此setMyState只要引用存在,就可以访问内存中的对象。最终反应将该引用存储在某处,以在重新myState渲染时将其返回。

  // A very simplified version of useState:
 let state; // the secret place were we keep the reference

 function useState(initial) {
  if(!state) state = initial;
  function setState(value) { // here we get the reference
    // food for thought: what happens to the object state referenced before here?
    state = value; // and here we store it
    render();
  }
  return [state, setState]; // here we pass on the reference to the render function
 }

 function render() {
  const [counter, setCounter] = useState({ value: 1 }); // here we get a reference to the object
  console.log(counter);
  setTimeout(() => setCounter({ value: counter.value + 1 }), 1000); // and here we pass a new one in
 }

 render();

如果不传递引用,那么当执行foo结束时,没有人可以访问bar,因此也没有人可以访问内存中的对象,因此垃圾收集器最终会出现。


以上都是谎言。JavaScript 中没有引用之类的东西(好吧,有一个 Reference ,但它正在做其他事情),也没有内存之类的东西。根据规范,这些值只是在“某处”附近。现在在实践中引擎确实将值存储在内存中,因此我所说的一切或多或少适用于所有主要引擎


推荐阅读