странно почему так происходит, ведь блок кода в {} должен быть изолирован. Поэтому появились 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 не обойтись?