【问题标题】:Arrow Function Hoisting in Node? [duplicate]节点中的箭头函数提升? [复制]
【发布时间】:2019-07-22 20:10:22
【问题描述】:

我在理解我的代码为何有效时遇到了一些麻烦。我预计会出现参考错误,但一切正常。

我的代码:

const functionA = () => {
  let bResult = functionB();

  console.log("Function A " + bResult);
};

const functionB = () => {
  return "Function B";
};

functionA();

我得到了这个输出(没有错误);

λ node test.js
Function A Function B

据我了解,只有函数声明被提升(不是函数表达式)http://adripofjavascript.com/blog/drips/variable-and-function-hoisting.html

因此,我不应该期待一个错误,因为在 FunctionA 中调用它之前未定义 FunctionB 吗?我是不是错过了这里的某个地方?

编辑:感谢大家的回答,我想我明白了。它确实没有被提升,因为如果我一开始就调用 functionA,它会给我一个错误。

functionA(); // ReferenceError: functionA is not defined

const functionA = () => {
  let bResult = functionB();

  console.log("Function A " + bResult);
};

const functionB = () => {
  return "Function B";
};

所以这不是提升的问题。相反,在文件末尾调用 functionA 时,已经定义了 functionA 和 functionB。

【问题讨论】:

  • functionA 实际执行时,functionB 将被设置。所以这很好用。如果您必须“按顺序”定义所有函数,那将非常烦人。更不用说,mutual recursion 依赖于这种行为。
  • @user633183 functionB 已设置,但在定义之前已在 functionA 中引用。既然没有吊起来,为什么不需要提前定义
  • 试试看:const functionA = () => {..}; functionA(); const functionB = () => {..}
  • @m0meni 因为functionB 被提升并且标识符 立即可用。但是,functionB 在实际定义 functionB 之前无法使用。 Adiga 关于在 functionB = ... 之前运行 functionA() 的评论将显示“有问题的”行为。
  • @m0meni 精确

标签: javascript node.js function arrow-functions hoisting


【解决方案1】:

正如其他人指出的那样,在调用 functionA 时, functionB 现在已加载到内存中。

比较以下:

const functionA = functionB;

const functionB = () => {
  return "Function B";
};

functionA();

这将抛出'Uncaught ReferenceError: functionB is not defined'

将该行为与此进行比较:

const functionA = functionB

function functionB(){
  return "Function B";
};

functionA();

第二个确实有效,因为 functionB 被提升到您的常量声明之上。

【讨论】:

  • 希望您不要介意编辑。我把它写成一个单独的答案,但问题在我完成之前就关闭了。
  • @user633183 我已经回滚了编辑,因为提升的工作方式不正确。
猜你喜欢
  • 1970-01-01
  • 2013-06-18
  • 2018-06-30
  • 2019-01-02
  • 2021-04-22
  • 1970-01-01
  • 2018-02-07
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多