2015-12-25 10 views
10

In JavaScript es möglich ist, zu tun:Objektliteral Eigenschaft Wert Stenografie unvereinbar mit `this`

var a = {this: this} 

aber mit ES6 Eigenschaft Stenografie ich Syntax:

var b = {this}; // SyntaxError: this is a reserved identifier 

Dies ist keine wirkliche Verwendung Fall, aber ich frage mich nur, was der Unterschied zwischen diesen beiden ist. Ich dachte, es sollte dasselbe tun (entweder ein neues Objekt erstellen oder einen Fehler werfen).

UPDATE:

Ich betreibe dieses Beispiel in Firefox 42.0. Es funktioniert jedoch in Babel-Node (es erstellt Objekt { this: {} } ohne Fehler). Was ist das richtige Verhalten?

+1

Welche Umgebung ist das? Es funktioniert für mich in Babel-Knoten. –

+0

Das gleiche gilt für mich, [funktioniert hier] (https://babeljs.io/repl/#?experimental=false&evaluate=true&loose=false&spec=true&code=var%20b%20%3D%20%7Bthis%7D%3B%20) – CodingIntrigue

+0

Es scheint in Babel-Knoten zu arbeiten. Siehe mein Update. – madox2

Antwort

8

Die Grammatik für diese Initialisierungsklausel für shorthand-Eigenschaften schreibt vor, dass der verwendete einzelne Ausdruck ein Identifier sein muss. Da this ein reserviertes Wort ist, handelt es sich nicht um einen Bezeichner, daher wird ein Syntaxfehler ausgegeben.

Der relevante Teil der Spezifikation ist section 12.2.6.

+1

Für was es wert ist, stimme ich zu, dass die Tatsache, dass Sie 'this' als Eigenschaftsnamen verwenden können, aber der Versuch im OP versagt, eine Sprachwarze darstellt, aber Sie gewöhnten sich an diese als JavaScript-Programmierer. – Pointy

+0

Ich bin verwirrt darüber. Erstens funktioniert 'this} zumindest für mich in babel-node. Babel kompiliert es in "{" this ": this};", was völlig legal ist. Ich verstehe, dass '{break}' nicht funktionieren konnte, selbst wenn 'break' als Schlüssel erlaubt ist, weil es keinen Bezeichner 'break' geben kann. Aber 'this' ist eine Art spezieller Bezeichner, tut mir leid, wenn ich die Terminologie nicht genau richtig habe. Also, ist das eine Sprachwarze, oder ist es Babel, die es erlaubt, wenn es nicht sollte, oder ist es egal welche Engine/Prozessor das OP verwendet, wenn es sollte? –