React 和 Javascript:等效于 C 函数原型?

React and Javascript: Equivalent for C function prototypes?

我用 React 做的一些实验得到了以下代码:

const BreadNav = props => {
  const initial={
    stack:[
      {
        name:"Home",
        render:React.cloneElement(
          props.children,
          {pushElement:pushElement}
        ),
        state:{}
      }
    ],
  };

  const [state, setState] = React.useState(initial);

  const pushElement = (oldState,elem) => {
    let newStack = JSON.parse(JSON.stringify(state.stack));
    newStack[newStack.length-1].state = oldState;
    newStack.push(elem);
    setState({
      ...state,
      stack:newStack
    });
  }
  
  return(
    state.stack[state.stack.length-1].render
  );
}

React 给了我 ReferenceError: can't access lexical declaration 'pushElement' before initialization ,这对行的顺序很有意义。如果这是 C,我只会抛出一个函数原型来声明 pushElement 并稍后定义它,但是我还没有看到 javascript 的答案。我该如何避免这个麻烦?

您可以使用函数 声明 ,即“”,而不是将函数值分配给 const 变量:

function BreadNav(props) {
  const initial = {
    stack: [
      {
        name: "Home",
        render: React.cloneElement(props.children, {pushElement}),
        state: {}
      }
    ],
  };

  const [state, setState] = React.useState(initial);

  function pushElement(oldState,elem) {
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    let newStack = JSON.parse(JSON.stringify(state.stack));
    newStack[newStack.length-1].state = oldState;
    newStack.push(elem);
    setState({
      ...state,
      stack: newStack
    });
  }
  
  return state.stack[state.stack.length-1].render;
}

但在这种情况下,在 对象字面量中使用它之前先定义函数 会更合适:

const BreadNav = props => {
  const pushElement = (oldState, elem) => {
    let newStack = JSON.parse(JSON.stringify(state.stack));
    newStack[newStack.length-1].state = oldState;
    newStack.push(elem);
    setState({
      ...state,
      stack: newStack
    });
  };
  const initial = {
    stack: [
      {
        name: "Home",
        render: React.cloneElement(props.children, {pushElement}),
        state: {}
      }
    ],
  };

  const [state, setState] = React.useState(initial);
  
  return state.stack[state.stack.length-1].render;
}

你仍然可以参考下面声明的statesetState变量,它们在范围内,你只需要确保在它们初始化之前不要调用函数。