Motiv für einen Strict-Mode-Syntaxfehler beim Löschen eines nicht qualifizierten Bezeichners?

Ich habe Probleme zu verstehen, warum im strengen Modus ein Syntaxfehler auftritt, wenndelete wird für einen nicht qualifizierten Bezeichner verwendet.

In den meisten Fällen ist es sinnvoll, ... wenn Sie Variablen auf die übliche Weise mit dem deklarierenvar Stichwort und dann versuchen, zu verwendendelete Auf ihnen würde es im nicht-strengen Modus stillschweigend fehlschlagen, daher ist es sinnvoll, dass der strenge Modus in diesen Fällen mit einem Fehler fehlschlägt.

Es gibt jedoch Fälle, in denen Siekippen Löschen Sie Bezeichner, diesind qualifiziert:

(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

}());

Der strikte Modus muss hier eine Laufzeitprüfung durchführen, da ein TypeError ausgelöst wird, wenn dies auftritt. Es gibt auch Fälle, in denen Siekönnen Nicht qualifizierte Bezeichner im nicht strengen Modus erfolgreich löschen ...

// "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

Meines Erachtens hängt es vom internen System ab, ob Sie (im nicht strengen Modus) Dinge löschen können oder nicht[[Configurable]] Eigenschaft und hat nichts mit qualifizierten Bezeichnern zu tun. Soweit ich das beurteilen kann, gibt es im strikten Modus keine Möglichkeit, nicht-globale Variablen zu löschen, die (als Eigenschaften der lokalen VO)sind konfigurierbar:

(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

}());

Meine Frage ist also, was bringt es, einen SyntaxError bei der Verwendung auszulösendelete Wann würde TypeError bei einem nicht qualifizierten Bezeichner sowieso werfen, wenn die Eigenschaft nicht konfigurierbar ist? Dies scheint eine unnötige Einschränkung zu sein, und in einigen Fällen scheint es keine andere Problemumgehung zu geben, als den strikten Modus nicht zu verwenden (drittes Beispiel). Kann jemand die Motivation hinter dieser Entscheidung erklären?

Update: Ich habe gerade gemerkt, dass ich die Tatsache übersehen habe, dass direkteval Aufrufe haben ihren eigenen Gültigkeitsbereich im strikten Modus anstelle des Gültigkeitsbereichs der aufrufenden Funktion, also im dritten Beispielfoo würde nicht unter strengen Modus definiert werden. Wie auch immer, die Laufzeitüberprüfung würde dies immer noch auffangen, aber es wirft eine Nebenfrage auf: Gibt es keine Möglichkeit, konfigurierbare lokale Variablen im strikten Modus zu haben, wie wir es mit tunevalwürden variable deklarationen nicht streng sein? AFAIK, die eine der wenigen legitimen Verwendungen von wareval.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage