По области видимости function declaration
Приветствую.
Хотел уточнить, как точно определяется доступность функций, объявленных просто как function имя(){} вот, в примере: function try1(){ //hoisted(); //ошибка (1) { //hoisted(); // выводит "foo" (2) function hoisted() { console.log("foo"); } } hoisted(); // выводит "foo" (3) } try1(); - поднятие функции получается доступно в блоке кода (2) - но при этом сама функция доступна и за пределами этого блока (после него) (3) - а "до" (1) нельзя Может где есть описание, как точно такое определение делается. Так само и с условным определением функций, то что я раньше выписывал себе из документации, смотрю не так сейчас работает |
Гугли в сторону "Временная мёртвая зона" ES6.
|
Нет, к TDZ это отношения не имеет.
Это FiB (так иногда обозначается - Function in Вlock). Это отдельная тема, которая описана в приложении к спецификации. https://262.ecma-international.org/9...lity-semantics Там, в частности, говорится, что до ES2015 это вообще никак не регламентировалось, и реализации в разных браузерах могли по-разному рассматривать этот случай. |
micscr,
Надо писать в строгом режиме - 'use strict'. Он для этого и создан - ограничивать старое поведение. Например, классы и модули в нем работают по-умолчанию, потому что это новые сущности. В местном учебнике это доходчиво описано - 1 и 2, и в любой непонятной ситуации можешь просто читать учебник, он постоянно обновляется, в нем достаточно актуальная информация. |
Rise, а в указанных вами статьях не говорится как строгий режим касается моей ситуации.
Так определять функции как в примере я и не собирался, но мало ли, встречу где..., постоянно ведь с чужим кодом |
micscr,
Там говорится про современный js. Современный js это ES6+. В старой версии js, ES5, блоки кода не имели свою область видимости. Отличия ES6 от ES5 можешь почитать здесь. |
Цитата:
Там говорится Цитата:
Цитата:
В какой области видимости объявлена функция hoisted? Если в области блока, то она поднимается в начало блока и работает случай (2). А почему тогда работает (3)? Если она в области функции try1, почему не работает (1)? |
Вот тут есть отрывок и с книги
Симпсон К {Вы пока еще не знаете JS} Область видимости и замыкания. https://habr.com/ru/company/piter/blog/587888/ Где все объяснено предельно просто Цитата:
|
Цитата:
function try1(){ //hoisted(); //ошибка (1) if (true) { //hoisted(); // выводит "foo" (2) function hoisted() { console.log("foo"); } } hoisted(); // выводит "foo" (3) } try1(); Цитата:
|
Цитата:
Но все равно не все четко. Вот в доках, сказано что Вызовет ошибку. Объявление функций в блоках if (a < b) { function f() {} } , а (2) работает и со строгим режимом |
Часовой пояс GMT +3, время: 00:04. |