Фрагмент 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, чтобы задать этот вопрос, однако я показал оба только для полноты картины. В них я также написал несколько кратких комментариев.
Мой вопрос: в обоих случаях, почему объявление функции «перезаписывает»/«затеняет» или имеет «приоритет» над объявлением переменной? Может кто-нибудь объяснить это поведение?
Я понимаю, что они, возможно, одинаковы (с точки зрения интерпретатора) с точки зрения конечного результата из-за явления «подъема», но почему объявление функции или объявление переменной имеет < strong>приоритет над другим, когда он интерпретируется/анализируется механизмом Javascript (во время этапа создания этапа)? то есть какой из них поднимается над другим? Я читал, что объявление функции имеет приоритет над объявлением переменной, но почему это так?
Кроме того, пожалуйста, обратитесь к первому фрагменту кода (но это относится к обоим случаям), является ли местоположение/адрес памяти «a», где он объявлен в строке 1 и строке 6, ТОЧНО одинаковым? А так как 'a' в обоих местах кода представляет объявление функции, каким будет значение 'a' в его ячейке памяти/адресе после синтаксического анализа строки 1 и строки 6. на этапе создания? Поскольку объявления функций «поднимаются» над объявлением переменных, означает ли это, что в строке 1 адрес памяти «a» указывает на объект функции «a», к концу создания фаза контекста выполнения?
В обоих фрагментах кода 'var a' не определено, поэтому почему является 't 'a' значением undefined к тому времени, когда мы достигнем фазы выполнения (у которой точка выполнения начинается в строке 6?) Разве движок Javascript просто говорит: «Ах, если мы позволим 'var a' 'перезаписывать' 'function a() {…}', она останется неопределенной и, следовательно, непригодной для использования. Принимая во внимание, что если мы позволим 'a' представлять указанную функцию, то, по крайней мере, пользователь может вызвать указанную функцию (даже до ее объявления, без получения ссылки на ошибку)". Это очень маловероятно, но звучит логично/идеально , может быть?
Итак, мои вопросы:
- В чем причина того, почему объявление функции перезаписывается или имеет приоритет над объявлением переменной? Это что-то, что мы просто принимаем на первый взгляд, потому что это реализация спецификаций ECMAScript, или мы можем объяснить такое поведение?
И
- Если возможно, не мог бы кто-нибудь ответить, что происходит в памяти, когда это происходит на каждом шагу?
Я пытался использовать свою интуицию в течение последних 8 часов (где я в конечном итоге попал в другое измерение других особенностей JavaScript, но это отдельная проблема), но я хотел бы знать, есть ли простое или конкретное объяснение или ответ на такое поведение.
Любая помощь в понимании всего этого будет высоко оценена.
a
имело бы значениеundefined
, если бы не было объявления функции - person Bergi   schedule 02.09.2017undefined
является значением. Не то, чтобыvar a
действительно присваивал это переменной, когда оператор встречается в выполнении. - person Bergi   schedule 02.09.2017var a = 100
, до выполнения) имеет объявление переменной (т. е.var a
) и в то же время присваивает значение undefined. только до тех пор, пока во время выполнения не встретится оператор инициализации переменной, где ему будет присвоено значение100
. Это правильно? Таким образом, ваше утверждение о том, чтоvar a
назначается неопределенным, когда оператор встречается в выполнении, противоречит этому, разве ему не присваивается значение undefined < i>до выполнения, а не во время выполнения? Да, это семантика, но я просто хочу внести ясность в этот вопрос. - person 151SoBad   schedule 04.09.2017var a
присваиваетсяundefined
, когда оператор встречается при выполнении. Да и в остальном все правильно. - person Bergi   schedule 04.09.2017