Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.01.2022, 15:33
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,577

По области видимости 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,138

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

Нет, к 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,577

Rise, а в указанных вами статьях не говорится как строгий режим касается моей ситуации.
Так определять функции как в примере я и не собирался, но мало ли, встречу где..., постоянно ведь с чужим кодом
Ответить с цитированием
  #5 (permalink)  
Старый 26.01.2022, 15:24
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

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

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

Последний раз редактировалось Rise, 26.01.2022 в 15:31.
Ответить с цитированием
  #6 (permalink)  
Старый 26.01.2022, 20:33
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от 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)?
Ответить с цитированием
  #7 (permalink)  
Старый 26.01.2022, 20:47
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

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

Почему браузерным движкам JS разрешается нарушать своим поведением спецификацию? Потому что эти движки уже обладали поведением, связанным с FiB, до появления блоковой видимости в ES6, и существовали опасения, что изменения, направленные на соответствие спецификации, могут нарушить работоспособность существующего кода JS веб-сайтов. Из-за этого в приложении B спецификации JS было сделано исключение, позволяющее некоторые отклонения для браузерных движков JS (и только!).
Потому, что так сделано!
Ответить с цитированием
  #8 (permalink)  
Старый 27.01.2022, 07:12
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,577

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

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

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

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

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

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

Ясно, спасибо.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создается 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