x declared after fn function but returns its value. Why fn didn't return undefined?
function doWork(){
  let fn = function(){ return x; }
  let x = 2;
  return fn();
}
console.log(doWork()); // 2x declared after fn function but returns its value. Why fn didn't return undefined?
function doWork(){
  let fn = function(){ return x; }
  let x = 2;
  return fn();
}
console.log(doWork()); // 2 
    
     
    
    Inside of your doWork() function, first you set up a function and assign it to fn --  This function is not invoked yet. You then define x as 2. After this definition you invoke fn() by calling return fn().
Because JavaScript works from top-to-bottom, x is defined at the time you reference fn(), so fn() is able to return x correctly.
This can be seen in the following:
function doWork() {
  let fn = function() {
    return x;
  }
  let x = 2;
  return fn();
}
console.log(doWork()); // 2