Показать сообщение отдельно
  #10 (permalink)  
Старый 01.08.2017, 16:48
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

рони,
Когда объявляем через var, создается свойство объекта window, с десриптором {..., configurable: false, ...}
<script>
var x = 3;
const descriptor = Object.getOwnPropertyDescriptor(window, 'x');
alert(descriptor.configurable);
</script>

, а если без var, то с true
<script>
x = 3;
const descriptor = Object.getOwnPropertyDescriptor(window, 'x');
alert(descriptor.configurable);
</script>

И именно поэтому генерируется ошибка в первом случае, когда мы пытаемся переопределить дескриптор этого свойства (добавляя геттер / сеттер).

Можно было бы определить переменную через var, получить дескриптор, добавить геттер / сеттер, и удалить свойство из объекта window, но т.к. ссылка на переменную создается в VariableEnvironment, то delete window.x всегда будет возвращать false.

Rise,
Цитата:
Выходит глобальные переменные в глобальном eval становятся configurable
Нашел это в спецификации
2. If code is eval code, then let configurableBindings be true else let configurableBindings be false.
...
[[Configurable]]: configurableBindings
Ответить с цитированием