"ECMAScript 사양 이해하기, 2부"의 추가 콘텐츠
왜 o2.foo가 AssignmentExpression인가요?
o2.foo는 할당이 없는 것처럼 보이기 때문에 AssignmentExpression처럼 느껴지지 않습니다. 왜 이것이 AssignmentExpression인가요?
사양은 실제로 AssignmentExpression이 매개변수로 사용되거나 할당의 오른쪽에 올 수 있도록 허용합니다. 예를 들어:
function simple(a) {
console.log('매개변수는 ' + a);
}
simple(x = 1);
// → “매개변수는 1”이 로깅됩니다.
x;
// → 1
…및…
x = y = 5;
x; // 5
y; // 5
o2.foo는 아무것도 할당하지 않는 AssignmentExpression입니다. 이는 다음 문법 생산에서 비롯되며 각각은 마지막 케이스까지 "가장 간단한" 케이스를 선택합니다:
AssignmentExpression은 반드시 할당을 포함할 필요가 없으며, 단순히 ConditionalExpression일 수도 있습니다:
(이 외의 생산도 있지만, 여기서는 관련된 것만 보여줍니다.)
ConditionalExpression은 반드시 조건부 (a == b ? c : d)를 포함할 필요가 없으며, 단순히 ShortcircuitExpression일 수도 있습니다:
그리고 계속해서:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
거의 다 왔습니다…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
좌절하지 마세요! 몇 개의 생산만 더 남았습니다…
그런 다음 LeftHandSideExpression에 대한 생산을 만나게 됩니다:
LeftHandSideExpression :NewExpressionCallExpressionOptionalExpression
o2.foo에 적용될 생산이 무엇인지 명확하지 않습니다. NewExpression이 실제로 new 키워드를 가질 필요가 없다는 것을 알고 혹은 알아내야 합니다.
MemberExpression은 우리가 찾던 것처럼 들리므로 이제 다음 생산을 다룹니다
따라서, o2.foo는 o2가 유효한 MemberExpression일 경우 MemberExpression입니다. 다행히도 이를 찾기 훨씬 더 쉬워졌습니다:
MemberExpression : PrimaryExpression
o2는 확실히 Identifier이므로 괜찮습니다. o2는 MemberExpression이며 따라서 o2.foo도 MemberExpression입니다. MemberExpression은 유효한 AssignmentExpression이므로 o2.foo도 AssignmentExpression입니다.