본문으로 건너뛰기

"ECMAScript 사양 이해하기, 2부"의 추가 콘텐츠

· 약 2분
[Marja Hölttä](https://twitter.com/marjakh), 추측적 사양 관찰자

o2.fooAssignmentExpression인가요?

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일 수도 있습니다:

AssignmentExpression : ConditionalExpression

(이 외의 생산도 있지만, 여기서는 관련된 것만 보여줍니다.)

ConditionalExpression은 반드시 조건부 (a == b ? c : d)를 포함할 필요가 없으며, 단순히 ShortcircuitExpression일 수도 있습니다:

ConditionalExpression : ShortCircuitExpression

그리고 계속해서:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

거의 다 왔습니다…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

좌절하지 마세요! 몇 개의 생산만 더 남았습니다…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

그런 다음 LeftHandSideExpression에 대한 생산을 만나게 됩니다:

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

o2.foo에 적용될 생산이 무엇인지 명확하지 않습니다. NewExpression이 실제로 new 키워드를 가질 필요가 없다는 것을 알고 혹은 알아내야 합니다.

NewExpression : MemberExpression

MemberExpression은 우리가 찾던 것처럼 들리므로 이제 다음 생산을 다룹니다

MemberExpression : MemberExpression . IdentifierName

따라서, o2.fooo2가 유효한 MemberExpression일 경우 MemberExpression입니다. 다행히도 이를 찾기 훨씬 더 쉬워졌습니다:

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

o2는 확실히 Identifier이므로 괜찮습니다. o2MemberExpression이며 따라서 o2.fooMemberExpression입니다. MemberExpression은 유효한 AssignmentExpression이므로 o2.fooAssignmentExpression입니다.