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 tuneval
würden variable deklarationen nicht streng sein? AFAIK, die eine der wenigen legitimen Verwendungen von wareval
.