Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   По области видимости function declaration (https://javascript.ru/forum/misc/83614-po-oblasti-vidimosti-function-declaration.html)

micscr 25.01.2022 15:33

По области видимости function declaration
 
Приветствую.
Хотел уточнить, как точно определяется доступность функций, объявленных просто как function имя(){}
вот, в примере:
function try1(){
  //hoisted(); //ошибка (1)
  {
    //hoisted(); // выводит "foo" (2)
    function hoisted() {
      console.log("foo");
    }
  }
  hoisted(); // выводит "foo" (3)
}
try1();

- поднятие функции получается доступно в блоке кода (2)
- но при этом сама функция доступна и за пределами этого блока (после него) (3)
- а "до" (1) нельзя

Может где есть описание, как точно такое определение делается.

Так само и с условным определением функций, то что я раньше выписывал себе из документации, смотрю не так сейчас работает

MallSerg 25.01.2022 16:08

Гугли в сторону "Временная мёртвая зона" ES6.

voraa 25.01.2022 22:02

Нет, к TDZ это отношения не имеет.
Это FiB (так иногда обозначается - Function in Вlock).

Это отдельная тема, которая описана в приложении к спецификации.
https://262.ecma-international.org/9...lity-semantics

Там, в частности, говорится, что до ES2015 это вообще никак не регламентировалось, и реализации в разных браузерах могли по-разному рассматривать этот случай.

micscr 26.01.2022 14:23

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

Rise 26.01.2022 15:24

micscr,
Там говорится про современный js. Современный js это ES6+. В старой версии js, ES5, блоки кода не имели свою область видимости.

Отличия ES6 от ES5 можешь почитать здесь.

voraa 26.01.2022 20:33

Цитата:

Сообщение от 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)?

voraa 26.01.2022 20:47

Вот тут есть отрывок и с книги
Симпсон К
{Вы пока еще не знаете JS} Область видимости и замыкания.
https://habr.com/ru/company/piter/blog/587888/
Где все объяснено предельно просто
Цитата:

Спецификация JS гласит, что объявления функций внутри блоков имеют блоковую область видимости, .... Однако большинство браузерных ядер JS (включая движок v8, который происходит от Chrome, но также используется в Node) ведет себя в соответствии с пунктом (2); это означает, что идентификатор имеет область видимости вне блока if, но значение-функция не инициализируется автоматически, поэтому оно остается равным undefined.

Почему браузерным движкам JS разрешается нарушать своим поведением спецификацию? Потому что эти движки уже обладали поведением, связанным с FiB, до появления блоковой видимости в ES6, и существовали опасения, что изменения, направленные на соответствие спецификации, могут нарушить работоспособность существующего кода JS веб-сайтов. Из-за этого в приложении B спецификации JS было сделано исключение, позволяющее некоторые отклонения для браузерных движков JS (и только!).
Потому, что так сделано!

micscr 27.01.2022 07:12

Цитата:

Сообщение от voraa (Сообщение 543311)
А почему тогда работает (3)?

С 'use strict' не работает (3).

Но все равно не все четко.

Вот в доках, сказано что

Вызовет ошибку.
Объявление функций в блоках if (a < b) { function f() {} }

, а (2) работает и со строгим режимом

MallSerg 27.01.2022 15:34

По моему все очевидно.
Мне совсем не понятно с чем остались вопросы?

micscr 28.01.2022 08:09

Ясно, спасибо.

voraa 28.01.2022 11:15

Цитата:

Сообщение от 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


Часовой пояс GMT +3, время: 18:54.