Я делаю курс Udemy Javascript: Understanding the Weird Parts прямо сейчас, и я только что узнал о фазе создания и стадии выполнения, происходит, когда интерпретатор интерпретирует JS.
У меня есть вопрос, но я сначала покажу вам код, с которым я играю:
http://codepen.io/rsf/pen/bEgpNY
b();
function b () {
console.log(a);
}
var a = 'peas';
b();
Если я правильно понимаю, на этапе создания переменные и функции "установлены", то есть им даются пятна в памяти. Все переменные имеют значение placeholder undefined. Затем на этапе выполнения двигатель выполняет строки, начинающиеся с вершины. Когда сначала вызывается b(), "a" все еще имеет значение-заполнитель undefined, тогда "a" получает свое начальное значение "peas", b() вызывается снова, и на этот раз "a" имеет значение "гороха". На мой взгляд, одна из двух вещей должна происходить здесь. Альтернатива 1: На этапе создания все переменные задаются перед функциями. Это означает, что когда создается пространство памяти для функции b(), функция включает значение undefined (поскольку пространство памяти 'a' уже было создано со значением 'undefined'). Альтернатива 2: функции и переменные задаются в лексическом порядке, в котором они находятся (в этом случае b создается до a), а когда b создается, ссылка "a" каким-то образом означает, что функция прослушивает любое возможное создание местоположения памяти "a" , и, когда позднее создается "a" , ссылка ссылается на это место.
Я нахожусь на правильном пути с любым из этих сценариев?