Почему блок не изолирует функцию
В замыканиях есть задача,
в блоке if {} указана декларативная функция, которая судя по ответу не работает, но по факту это не так let phrase = "Hello"; if (true) { let user = "John"; function sayHi() { alert(`${phrase}, ${user}`); } } sayHi(); // будет выполнена Почему? |
Блочная область видимости может быть только у переменных, объявленных через let или const.
У переменных объявленных через var или у функций заданных через function областью видимости глобальная или вся функция, где они объявлены Вот так const sayHi = function () { alert(`${phrase}, ${user}`); } Будет только в блоке. |
странно почему так происходит, ведь блок кода в {} должен быть изолирован. Поэтому появились 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 не обойтись? |
Цитата:
Цитата:
Возможно, имеется в виду, что всякие вебпаки и тому подобное делают такое обертывание сами. В рабочих проектах не приходится писать IIFE, кругом один сплошной import/export, который переделывается сборщиком. |
это работает правильно в строгом режиме
'use strict' let a = 1 function x() { return 1 } { let a = 2 function x() { return 2 } } alert(a) // по прежнему 1 alert(x()) // ожидаемо 1 |
Цитата:
А те же стрелочные по другому и не объявить. |
В нестрогом режиме оно не работает по причинам обратной совместимости, очевидно. Если просто взять и выкатить такую хрень без доп. модификаторов - это сломает половину интернета.
И идея с "use strict" тож такая себе. Сейчас это сработвло. Но когда через N лет опять надо будет что-то ломающее добавить, придётся вводить "use super strict" или типа того.) voraa, бесят меня "объявлтели стрелочек через const", это всю семантику ломает. Функция должна быть функцией, пока не возникло явной необходимости в ином. |
Цитата:
|
Часовой пояс GMT +3, время: 11:06. |