рони,
Когда объявляем через 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