Почему блок не изолирует функцию
В замыканиях есть задача,
в блоке 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, время: 08:09. |