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