
25.01.2022, 15:33
|
 |
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,578
|
|
По области видимости function declaration
Приветствую.
Хотел уточнить, как точно определяется доступность функций, объявленных просто как function имя(){}
вот, в примере:
function try1(){
//hoisted(); //ошибка (1)
{
//hoisted(); // выводит "foo" (2)
function hoisted() {
console.log("foo");
}
}
hoisted(); // выводит "foo" (3)
}
try1();
- поднятие функции получается доступно в блоке кода (2)
- но при этом сама функция доступна и за пределами этого блока (после него) (3)
- а "до" (1) нельзя
Может где есть описание, как точно такое определение делается.
Так само и с условным определением функций, то что я раньше выписывал себе из документации, смотрю не так сейчас работает
Последний раз редактировалось micscr, 25.01.2022 в 15:35.
|
|

25.01.2022, 16:08
|
 |
Профессор
|
|
Регистрация: 07.03.2011
Сообщений: 1,141
|
|
Гугли в сторону "Временная мёртвая зона" ES6.
|
|

25.01.2022, 22:02
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,775
|
|
Нет, к TDZ это отношения не имеет.
Это FiB (так иногда обозначается - Function in Вlock).
Это отдельная тема, которая описана в приложении к спецификации.
https://262.ecma-international.org/9...lity-semantics
Там, в частности, говорится, что до ES2015 это вообще никак не регламентировалось, и реализации в разных браузерах могли по-разному рассматривать этот случай.
|
|

26.01.2022, 14:23
|
 |
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,578
|
|
Rise, а в указанных вами статьях не говорится как строгий режим касается моей ситуации.
Так определять функции как в примере я и не собирался, но мало ли, встречу где..., постоянно ведь с чужим кодом
|
|

26.01.2022, 20:33
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,775
|
|
Сообщение от Rise
|
В старой версии js, ES5, блоки кода не имели свою область видимости.
Отличия ES6 от ES5 можешь почитать здесь.
|
Вот ничего там не написано, про случай и пример micscr
Там говорится
Цитата:
|
are hoisted: independently of where a function declaration is mentioned in its scope, it is always created at the beginning of the scope.
|
Т.е
Цитата:
|
независимо от того, где объявление функции упоминается в ее области видимости, она всегда создается в начале области видимости.
|
Посмотрим на пример micscr.
В какой области видимости объявлена функция hoisted?
Если в области блока, то она поднимается в начало блока и работает случай (2). А почему тогда работает (3)?
Если она в области функции try1, почему не работает (1)?
|
|

26.01.2022, 20:47
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,775
|
|
Вот тут есть отрывок и с книги
Симпсон К
{Вы пока еще не знаете JS} Область видимости и замыкания.
https://habr.com/ru/company/piter/blog/587888/
Где все объяснено предельно просто
Цитата:
|
Спецификация JS гласит, что объявления функций внутри блоков имеют блоковую область видимости, .... Однако большинство браузерных ядер JS (включая движок v8, который происходит от Chrome, но также используется в Node) ведет себя в соответствии с пунктом (2); это означает, что идентификатор имеет область видимости вне блока if, но значение-функция не инициализируется автоматически, поэтому оно остается равным undefined.
Почему браузерным движкам JS разрешается нарушать своим поведением спецификацию? Потому что эти движки уже обладали поведением, связанным с FiB, до появления блоковой видимости в ES6, и существовали опасения, что изменения, направленные на соответствие спецификации, могут нарушить работоспособность существующего кода JS веб-сайтов. Из-за этого в приложении B спецификации JS было сделано исключение, позволяющее некоторые отклонения для браузерных движков JS (и только!).
|
Потому, что так сделано!
|
|

27.01.2022, 07:12
|
 |
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,578
|
|
Сообщение от voraa
|
А почему тогда работает (3)?
|
С 'use strict' не работает (3).
Но все равно не все четко.
Вот в доках, сказано что
Вызовет ошибку.
Объявление функций в блоках if (a < b) { function f() {} }
, а (2) работает и со строгим режимом
|
|

27.01.2022, 15:34
|
 |
Профессор
|
|
Регистрация: 07.03.2011
Сообщений: 1,141
|
|
По моему все очевидно.
Мне совсем не понятно с чем остались вопросы?
|
|

28.01.2022, 08:09
|
 |
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,578
|
|
Ясно, спасибо.
|
|

28.01.2022, 11:15
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,775
|
|
Сообщение от Rise
|
в английской версии уже нет этого пункта.
|
Может в другом месте, но есть
Цитата:
|
Second, strict mode prohibits function statements that are not at the top level of a script or function. In normal mode in browsers, function statements are permitted "everywhere". This is not part of ES5 (or even ES3)! It's an extension with incompatible semantics in different browsers. Note that function statements outside top level are permitted in ES2015.
'use strict';
if (true) {
function f() { } // !!! syntax error
f();
}
for (var i = 0; i < 5; i++) {
function f2() { } // !!! syntax error
f2();
}
function baz() { // kosher
function eit() { } // also kosher
}
|
https://developer.mozilla.org/en-US/...ce/Strict_mode
|
|
|
|