Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.09.2021, 13:20
Аватар для lgick
Аспирант
Отправить личное сообщение для lgick Посмотреть профиль Найти все сообщения от lgick
 
Регистрация: 23.11.2013
Сообщений: 96

Почему блок не изолирует функцию
В замыканиях есть задача,
в блоке if {} указана декларативная функция, которая судя по ответу не работает, но по факту это не так

let phrase = "Hello";

if (true) {
  let user = "John";

  function sayHi() {
    alert(`${phrase}, ${user}`);
  }
}

sayHi(); // будет выполнена



Почему?
Ответить с цитированием
  #2 (permalink)  
Старый 02.09.2021, 13:58
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Блочная область видимости может быть только у переменных, объявленных через let или const.
У переменных объявленных через var или у функций заданных через function областью видимости глобальная или вся функция, где они объявлены
Вот так
const sayHi = function () {
    alert(`${phrase}, ${user}`);
  }

Будет только в блоке.
Ответить с цитированием
  #3 (permalink)  
Старый 02.09.2021, 16:01
Аватар для lgick
Аспирант
Отправить личное сообщение для lgick Посмотреть профиль Найти все сообщения от lgick
 
Регистрация: 23.11.2013
Сообщений: 96

странно почему так происходит, ведь блок кода в {} должен быть изолирован. Поэтому появились const и let и устарел var

Также в учебнике конструкция IIFE :

(function () {
...
}())


считается устаревшей
ведь появилось лексическое окружение в блоке кода,
но оно работает не всегда и может создавать ошибки:

let a = 1
function x() {
   return 1
}

{
  let a = 2
  function x() {
      return 2
  }
}

alert(a) // по прежнему 1
alert(x()) // неожиданно 2



выходит для инкапсуляции без IIFE не обойтись?

Последний раз редактировалось lgick, 02.09.2021 в 16:04.
Ответить с цитированием
  #4 (permalink)  
Старый 02.09.2021, 16:52
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от lgick
судя по ответу не работает
Косяк в учебнике. Наверняка о нем есть тут пару слов - https://github.com/javascript-tutori...pt.info/issues (или в английской версии)
Сообщение от lgick
выходит для инкапсуляции без IIFE не обойтись?
Да.
Возможно, имеется в виду, что всякие вебпаки и тому подобное делают такое обертывание сами. В рабочих проектах не приходится писать IIFE, кругом один сплошной import/export, который переделывается сборщиком.
Ответить с цитированием
  #5 (permalink)  
Старый 02.09.2021, 17:07
Аватар для lgick
Аспирант
Отправить личное сообщение для lgick Посмотреть профиль Найти все сообщения от lgick
 
Регистрация: 23.11.2013
Сообщений: 96

это работает правильно в строгом режиме

'use strict'
let a = 1
function x() {
   return 1
}

{
  let a = 2
  function x() {
      return 2
  }
}

alert(a) // по прежнему 1
alert(x()) // ожидаемо 1
Ответить с цитированием
  #6 (permalink)  
Старый 02.09.2021, 18:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Сообщение от lgick
выходит для инкапсуляции без IIFE не обойтись?
Объявлять функции через const и никаких проблем.
А те же стрелочные по другому и не объявить.

Последний раз редактировалось voraa, 02.09.2021 в 18:26.
Ответить с цитированием
  #7 (permalink)  
Старый 03.09.2021, 03:42
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

В нестрогом режиме оно не работает по причинам обратной совместимости, очевидно. Если просто взять и выкатить такую хрень без доп. модификаторов - это сломает половину интернета.
И идея с "use strict" тож такая себе. Сейчас это сработвло. Но когда через N лет опять надо будет что-то ломающее добавить, придётся вводить "use super strict" или типа того.)

voraa, бесят меня "объявлтели стрелочек через const", это всю семантику ломает. Функция должна быть функцией, пока не возникло явной необходимости в ином.
__________________
29375, 35

Последний раз редактировалось Aetae, 03.09.2021 в 03:47.
Ответить с цитированием
  #8 (permalink)  
Старый 03.09.2021, 08:38
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,214

Сообщение от Aetae
бесят меня "объявлтели стрелочек через const"
Так ведь в любой книжке их так и объявляют...
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему trackbar не отображается на странице, если получаешь его через блок? DDim1000 Общие вопросы Javascript 1 04.11.2016 11:24
Почему выполняется блок else? DivMan Общие вопросы Javascript 2 10.03.2016 14:11
Jquery Скрыть/Показать блок при наведении tot_kotoryi Ваши сайты и скрипты 1 08.02.2016 23:15
Меню + ниже блок div dima_riabets Элементы интерфейса 0 28.12.2015 02:10
Ховер и появляющий блок Shuryga Элементы интерфейса 3 28.09.2015 14:39