Причиной ошибки синтаксиса строгого режима при удалении неквалифицированного идентификатора?
Мне трудно понять, почему в строгом режиме возникает синтаксическая ошибка, когдаdelete
используется для неквалифицированного идентификатора.
В большинстве случаев это имеет смысл ... если вы объявляете переменные обычным способом с помощьюvar
ключевое слово, а затем пытается использоватьdelete
на них в нестрогом режиме произойдет сбой без предупреждения, поэтому имеет смысл сбой строгого режима с ошибкой в этих случаях.
Однако есть случаи, когда выcan't удалить идентификаторы, которыеare квалифицированный:
(function() {
// "use strict";
var obj = Object.create({}, { bloop: { configurable: false } });
delete obj.bloop; // throws TypeError in strict mode, silently fails in non-strict.
console.log('bloop' in obj); // true
}());
Строгий режим должен выполнять проверку во время выполнения, поскольку при этом возникает ошибка TypeError. Есть также случаи, когда выcan успешно удалить неквалифицированные идентификаторы в нестрогом режиме ...
// "use strict";
window.bar = 6;
console.log(typeof bar); // number
delete bar; // works in non-strict, syntax error in strict!
console.log(typeof bar); // undefined
На самом деле, насколько я понимаю, вы можете удалить вещи (в нестрогом режиме), зависит от внутреннего[[Configurable]]
свойство, и не имеет ничего общего с квалифицированными идентификаторами. Насколько я могу судить, в строгом режиме нет способа удалить неглобальные переменные, которые (как свойства локального VO)are настраивается:
(function() {
// "use strict";
eval('var foo = 5;');
console.log(typeof foo); // number
delete foo; // works in non-strict, SyntaxError in strict.
console.log(typeof foo); // undefined
}());
Итак, мой вопрос в том, какой смысл выдавать SyntaxError при использованииdelete
для неквалифицированного идентификатора, когда TypeError все равно будет выдавать, если свойство не настраивается? Это кажется ненужным ограничением, и в некоторых случаях кажется, что нет другого обходного пути, кроме как не использовать строгий режим (третий пример). Кто-нибудь может объяснить мотивы этого решения?
Обновление: я только что понял, что я упускаю из виду тот факт, что прямойeval
вызовы имеют строгую область видимости в строгом режиме вместо области видимости вызывающей функции, поэтому в третьем примереfoo
не будет определен в строгом режиме. В любом случае, проверка во время выполнения все равно поймает это, но это поднимает побочный вопрос: нет ли способа иметь настраиваемые локальные переменные в строгом режиме, как мы делаем сeval
& d; объявления переменных в нестрогих? AFAIK, который был одним из немногих законных примененийeval
.