Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Arrow Function Hoisting in Node? [duplicate]

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.

like image 366
Jason Avatar asked Feb 28 '19 20:02

Jason


1 Answers

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.

like image 63
Brenn Avatar answered Sep 20 '22 21:09

Brenn