【发布时间】: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