спецификации Поднятие функции происходит на шаге 5 этой процедуры. Переменный подъем происходит в шаге 8. Шаг 5 предшествует шагу 8, сначала происходит подъем функции ergo.

ент 1:

var a; // undefined variable named 'a'
function a(foo) { // a function named 'a'
  var foo = "Hello World";
  console.log(foo);
}
console.log(a); // output is: [Function: a], but why not undefined?

Фрагмент 2:

function a(foo) { // a function named 'a'
    var foo = "Hello World";
    console.log(foo);
}
var a; // undefined variable named 'a'
console.log(a); // output is: [Function: a], but why not undefined?

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

У меня вопрос в обоих случаях, почему объявление функции ‘перезапись»/» затенениеИли приниматьстаршинствоНад объявлением переменной? Может кто-нибудь объяснить, пожалуйста, это поведение?

Я понимаю, что они, возможно, одинаковы (с точки зрения переводчика) с точки зрения конечного результата из-за явления «подъема», ноПочему имеет ли объявление функции или объявление переменнойстаршинство над другим, когда он интерпретируется / анализируется движком Javascript (в течение творчество фаза)? то есть какой из них поднимается над другим? Я читал, что объявление функции имеет приоритет над объявлением переменной - ноПочему это тот случай?

Также, пожалуйста, обратитесь к первому фрагменту кода (но это относится к обоим случаям), этоячейка памяти / адрес из «а», где это объявлено в строке 1 и строке 6, точно так же? И так как "а", в обоихместа кода, представляет объявление функции, что будетзначение «a» в его ячейке памяти / адресе после разбора строки 1 и строки 6 во время фаза создания? Поскольку объявления функций «поднимаются» над объявлением переменной, означает ли это, что в строке 1 «адрес памяти aуказывая на функциональный объект «а»к концутворчество фаза контекста исполнения?

В обоихфрагменты кода'Var a' не определено, поэтомуПочему ISNt ‘А’ значениене определено к тому времени, когда мы достигнемвыполнение фаза (которая имеет своюточка выполнения, начинающаяся на строке 6?) ЛиДвижок JavaScript просто скажите: «Ах, если мы позволим« var a »« перезаписать »функцию a () {…} ', она останется неопределенной и, следовательно, непригодной для использования. Принимая во внимание, что если мы разрешаем 'a' представлять указанную функцию, то, по крайней мере, пользователь может вызвать указанную функцию (даже до ее объявления, без получения ошибки ссылки) ". Это очень маловероятно, но звучит логично / идеально , может быть?

Итак, мои вопросы:

В чем причина позади, почему объявление функции перезаписывается или имеет приоритет над объявлением переменной? Это то, что мы просто принимаем prima-facie, потому что это реализация спецификаций ECMAScript, или мы можем объяснить это поведение?

А также

Если возможноМожет кто-нибудь ответитьчто происходит в памяти когда это происходит на каждом шагу?

Я пытался использовать свою интуицию в течение последних 8 часов (где я в итоге оказался в другом измерении других особенностей JavaScript, но это уже другая проблема), но я бы хотел знать, есть ли простое или конкретное объяснение или ответ на это поведение.

Любая помощь в понимании всего этого будет высоко ценится.

Ответы на вопрос(2)

Ваш ответ на вопрос