В отличие от многих других языков, Javascript - это интерпретируемый язык, на котором у нас может быть такой код.

var x = doThis(); // function call, assign statement

console.log(x); // print statement

function doThis(){ //function declaration
return "Hello World"; //return statement
}

Приведенный выше код выполняется отлично и выводит на консоль очень невинное «Hello World». Но для нормальных людей или людей, не знакомых со стилем программирования JS, это не что иное, как головоломка ...

Но иногда формулировка вопросов для получения правильных ответов сама по себе очень трудна. Итак, в этой статье делается попытка сформулировать эти вопросы и ответить на них простым и кратким образом…. И здесь задаются вопросы

  • Когда во времени (во время выполнения) действительно выполняется инструкция печати?
  • До или после анализа объявления функции?
  • И если он выполняется раньше, как, потому что компилятора нет, а код выполняется немедленно?

Теперь ответная часть

Среда выполнения JS выполняет каждый фрагмент кода в контексте выполнения. И каждый контекст выполнения имеет 2 этапа:

  • Этап создания. На этом этапе создаются все области, переменные и функции. Также устанавливает контекст «this».
  • Этап выполнения. На этом этапе фактически выполняется код, подобный операторам console.log( ), путем отправки понятных для машины команд.

Теперь, когда браузер впервые загружает ваш скрипт, он по умолчанию входит в глобальный контекст выполнения. Этот контекст выполнения также будет иметь этапы создания и выполнения.

Теперь рассмотрим Кодекс выше. Вот псевдокодовое представление того, что делает интерпретатор Javascript.

 // First Pass
 1.Find some code to invoke a function.
 2.Before executing the function code, create a context to execute in.
 3.Enter the Creation Stage:  
     - Create a scope chain
     - Scan for function declarations 
 // In your case, this is where *doThis()* is stored in the global scope
     - Scan for var declarations  
       // This is where *var x* is set to *undefined*
4. Run/interpret the function code in the context(Execution Stage)
  // Now as per the sequence line 1 will run and set *var x = "Hello World"*
  // And then followed by line 2 which will print "Hello World" to console.

Ссылки и кредиты

Этот пост является прямым преобразованием вопроса о StackOverflow, который, как я считаю, заслуживает большего уважения, чем дано.
Кроме того, этот пост относится к статье Дэвида Шариффа, в которой подробно и просто объясняется весь процесс. . И несколько ссылок на документы MDN: