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.
functionAis actually executed,functionBwill be set. So this works just fine. It would be terribly annoying if you had to define all of your functions "in order". Not to mention, mutual recursion depends on this behavior.functionBis set, but it's referred to infunctionAbefore it's defined. Why doesn't it need to be defined in advance given that it isn't hoistedconst functionA = () => {..}; functionA(); const functionB = () => {..}functionBis hoisted and the identifier is available immediately. However, the value forfunctionBis not ready to use untilfunctionBis actually defined. Adiga's comment about runningfunctionA()before thefunctionB = ...will show the "problematic" behavior.