问题
I'm having a bit of trouble understanding why my code works. I'm expecting a reference error, but everything works fine.
My code:
const functionA = () => {
let bResult = functionB();
console.log("Function A " + bResult);
};
const functionB = () => {
return "Function B";
};
functionA();
I get this output (no errors);
λ node test.js
Function A Function B
As I understand it, only function declarations are hoisted (not function expressions) http://adripofjavascript.com/blog/drips/variable-and-function-hoisting.html.
Thus, shouldn't I expect an error as FunctionB isn't defined before it's called in FunctionA? Am I missing somewhere here?
EDIT: Thanks for the answers everyone, I think I figured it out. It's indeed not getting hoisted because if I call functionA at the beginning, it gives me an error.
functionA(); // ReferenceError: functionA is not defined
const functionA = () => {
let bResult = functionB();
console.log("Function A " + bResult);
};
const functionB = () => {
return "Function B";
};
So it's not a question of hoisting. Rather, by the time functionA is called at the end of the file, both functionA and functionB have been defined.
回答1:
As someone else pointed out, by the time functionA is called, functionB is now loaded into memory.
Compare the following:
const functionA = functionB;
const functionB = () => {
return "Function B";
};
functionA();
This will throw 'Uncaught ReferenceError: functionB is not defined'
Compare that behavior to this:
const functionA = functionB
function functionB(){
return "Function B";
};
functionA();
The second one actually works, because functionB is hoisted above your constant declaration.
来源:https://stackoverflow.com/questions/54933689/arrow-function-hoisting-in-node