путаница с присвоением значения undefined с использованием IIFE с undefined в качестве параметра

В настоящее время я изучаю javascript, следуя серии книг «Вы не знаете js».

В книге, раздел «Область и закрытие», где автор обсуждает «IIFE», автор упомянул

Другое применение этого шаблона направлено на решение (незначительной ниши) проблемы, связанной с тем, что значение неопределенного идентификатора по умолчанию может быть неправильно перезаписано, что приведет к неожиданным результатам. Назвав параметр неопределенным, но не передав никакого значения для этого аргумента, мы можем гарантировать, что неопределенный идентификатор на самом деле является неопределенным значением в блоке кода:

undefined = true; // setting a land-mine for other code! avoid!

(function IIFE( undefined ){

  var a;
  if (a === undefined) {
      console.log( "Undefined is safe here!" );
  }

})();

Но я думал, что undefined - это недоступная для записи переменная. И когда я попробовал undefined = true; в браузере Chrome, значение undefined действительно не изменилось (т.е. присваивание не удалось выполнить в нестрогом режиме). Так почему же автор пытается назначить undefined?

А во-вторых, я не совсем уверен, какова цель функции IIFE с параметром undefined? Каковы некоторые из потенциальных применений?


person Thor    schedule 06.07.2017    source источник
comment
Так почему же автор пытается назначить undefined ? undefined не всегда был доступен только для чтения. Раньше, чтобы избежать поломки вашего кода из-за того, что кто-то испортил undefined, вы просто создали свою собственную версию.   -  person Felix Kling    schedule 07.07.2017
comment
Это изменилось в более поздней версии ES — с этим связаны устаревшие вопросы. У ES3 таких гарантий нет — не уверен, что ES5 или ES6 исправили ситуацию.   -  person user2864740    schedule 07.07.2017
comment
также вы можете установить переменную с именем undefined, что, если у вас есть определенный объем вещей, может все испортить.   -  person Jhecht    schedule 07.07.2017
comment
На ваш второй вопрос отвечает цитата, которую вы вставили: Назначая параметру имя undefined, но не передавая никакого значения для этого аргумента, мы можем гарантировать, что идентификатор undefined на самом деле является неопределенным значением в блоке кода   -  person melpomene    schedule 07.07.2017
comment
@FelixKling ах, хорошо, так что undefined раньше было доступно для записи, но теперь это свойство доступно только для чтения. Имеет смысл   -  person Thor    schedule 07.07.2017
comment
developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/ говорит: В современных браузерах (JavaScript 1.8.5/Firefox 4+) undefined является ненастраиваемым и недоступным для записи свойством в соответствии со спецификацией ECMAScript 5. Так что, по-видимому, до ES5 undefined был доступен для записи.   -  person melpomene    schedule 07.07.2017
comment
Также вы не знаете, в каких браузерах работает ваш код. Не то чтобы я думал, что в наши дни люди используют такие старые браузеры, но для принятия ES5 потребовалось некоторое время.   -  person Felix Kling    schedule 07.07.2017
comment
@melpomene Я понимаю, почему автор придумал IIFE с undefined в качестве параметра, но я думаю, что я пытался спросить: каково практическое использование такой вещи?   -  person Thor    schedule 07.07.2017