Zusätzlicher Inhalt für "Understanding the ECMAScript spec, Teil 2"
Warum ist o2.foo
ein AssignmentExpression
?
o2.foo
sieht nicht wie eine AssignmentExpression
aus, da es keine Zuweisung gibt. Warum ist es trotzdem eine AssignmentExpression
?
Die Spezifikation erlaubt tatsächlich eine AssignmentExpression
sowohl als Argument als auch auf der rechten Seite einer Zuweisung. Zum Beispiel:
function simple(a) {
console.log('Das Argument war ' + a);
}
simple(x = 1);
// → Gibt „Das Argument war 1“ aus.
x;
// → 1
…und…
x = y = 5;
x; // 5
y; // 5
o2.foo
ist eine AssignmentExpression
, die nichts zuweist. Dies ergibt sich aus den folgenden Produktionsregeln der Grammatik, jede nimmt den "einfachsten" Fall bis zur letzten:
Eine AssignmentExpression
muss keine Zuweisung enthalten, sie kann auch einfach eine ConditionalExpression
sein:
(Es gibt auch andere Produktionsregeln, aber hier zeigen wir nur die relevante.)
Eine ConditionalExpression
muss keine Bedingung (a == b ? c : d
) enthalten, sie kann auch einfach eine ShortcircuitExpression
sein:
Und so weiter:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
Fast geschafft…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
Nicht verzweifeln! Nur noch ein paar Produktionsregeln…
Dann stoßen wir auf die Produktionsregel für LeftHandSideExpression
:
LeftHandSideExpression :
NewExpression
CallExpression
OptionalExpression
Es ist nicht eindeutig, welche Produktionsregel auf o2.foo
zutreffen könnte. Wir müssen lediglich wissen (oder herausfinden), dass eine NewExpression
nicht unbedingt das Schlüsselwort new
enthalten muss.
MemberExpression
klingt nach etwas, das wir gesucht haben, daher nehmen wir nun die Produktionsregel
Also ist o2.foo
eine MemberExpression
, wenn o2
eine gültige MemberExpression
ist. Glücklicherweise ist das viel einfacher zu erkennen:
MemberExpression : PrimaryExpression
o2
ist sicher ein Identifier
, also sind wir gut. o2
ist eine MemberExpression
, also ist o2.foo
auch eine MemberExpression
. Eine MemberExpression
ist eine gültige AssignmentExpression
, daher ist o2.foo
auch eine AssignmentExpression
.