Причиной ошибки синтаксиса строгого режима при удалении неквалифицированного идентификатора?

Мне трудно понять, почему в строгом режиме возникает синтаксическая ошибка, когда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.

Ответы на вопрос(2)

Ваш ответ на вопрос