Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.01.2022, 15:33
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 25.01.2022, 16:08
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,141

Гугли в сторону "Временная мёртвая зона" ES6.
Ответить с цитированием
  #3 (permalink)  
Старый 25.01.2022, 22:02
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,775

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

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

Там, в частности, говорится, что до ES2015 это вообще никак не регламентировалось, и реализации в разных браузерах могли по-разному рассматривать этот случай.
Ответить с цитированием
  #4 (permalink)  
Старый 26.01.2022, 14:23
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,578

Rise, а в указанных вами статьях не говорится как строгий режим касается моей ситуации.
Так определять функции как в примере я и не собирался, но мало ли, встречу где..., постоянно ведь с чужим кодом
Ответить с цитированием
  #5 (permalink)  
Старый 26.01.2022, 20:33
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 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)?
Ответить с цитированием
  #6 (permalink)  
Старый 26.01.2022, 20:47
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 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 (и только!).
Потому, что так сделано!
Ответить с цитированием
  #7 (permalink)  
Старый 27.01.2022, 07:12
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,578

Сообщение от voraa Посмотреть сообщение
А почему тогда работает (3)?
С 'use strict' не работает (3).

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

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

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

, а (2) работает и со строгим режимом
Ответить с цитированием
  #8 (permalink)  
Старый 27.01.2022, 15:34
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,141

По моему все очевидно.
Мне совсем не понятно с чем остались вопросы?
Ответить с цитированием
  #9 (permalink)  
Старый 28.01.2022, 08:09
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,578

Ясно, спасибо.
Ответить с цитированием
  #10 (permalink)  
Старый 28.01.2022, 11:15
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 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
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создается function Function(){} ? Cepairda Общие вопросы Javascript 0 10.02.2016 15:03
Как узнать в какой области видимости находится элемент? Shitbox2 Angular.js 2 07.06.2014 13:36
Объект внутри прототипа StSpirit Общие вопросы Javascript 81 03.12.2013 03:34
Как доступится к свойствам созданной коллекции? assd18 Backbone.js 8 01.12.2013 20:37
хитросплетения Global,контекст,this,Reference kefi Общие вопросы Javascript 109 20.11.2009 23:34