Кто-нибудь, пожалуйста, помогите мне понять следующий сценарий:
//Outer funtion
function foo() {
console.info('outer foo');
}
{
//Inner function
function foo() {
console.info('inner foo');
}
}
foo(); //Says "inner foo"
Я предполагаю, что в приведенном выше случае явное замедление внутренней функции заменяет поднятую внешнюю функцию после выполнения блока.
Означает ли это, что блоки ES6 ТОЛЬКО предотвращают подъем функций при объявлении внутри?
Обновлять
Многие считают, что блоки не выполняют функции. Но, пожалуйста, посмотрите следующий сценарий согласно MDN:
foo('outside'); // TypeError: foo is not a function { function foo(location) { console.info('foo is called ' + location); } foo('inside'); // works correctly and logs 'foo is called inside' }
To be more precise, the block statement is preventing the function declaration from being hoisted to the top of the scope. The function is behaving as if it were defined as a function expression and, as such, it is only the implicit variable declaration that gets hoisted to the top of the scope
Еще одно обновление
Документация была неправильной, и ее только что исправил эксперт, предоставивший выбранный ответ.
«ближайшая объемлющая область функций», как в непосредственном охватывающем блоке?
Нет, не блокировать; функция. Простые блоки не имеют значения.
Хорошо, если это не внутри функции, оно поднимается наверх единицы кода (например, содержимое тега <script>
).
Но, согласно MDN, функции, объявленные в блоках, не поднимаются. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Эта страница неверна. MDN — это вики.
Что ж - Вот уж поистине не ожидалось! Спасибо.
MDN говорит: в нестрогом коде объявления функций внутри блоков ведут себя странно. Не используйте их. Я думаю, это какой-то баг. Или, если вы знаете ответ, почему функции ведут себя странно внутри блока, пожалуйста, прокомментируйте его. У меня такое же сомнение. Спасибо.
I assume that in the above case the Inner function's explicit deceleration is replacing the hoisted outer function after the block is executed.
Объявления функций, такие как операторы var
, поднимаются в начало функции во время начального сканирования функции перед выполнением кода внутри нее.
Блоки не имеют отношения к подъему операторов var
или объявлений функций (оба из которых имеют область действия). Они имеют значение только для let
и const
, которые имеют блочную область действия.
Но, согласно MDN, функции, объявленные в блоках, не поднимаются. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
вау, ты быстрый :) я как раз собирался отметить это для технического обзора
Оператор объявления
function
всегда поднимается в ближайшую охватывающую область функция, а не в блок.