var a = 3 * 6;
var b = a;
b;
3 * 6
, b = a
, b
, …
a = 3 * 6
, b = a
var a = 3 * 6;
, var b = a;
b;
모든 문은 완료값을 가진다.
var b = a;
문의 완료값은 ?undefined
b = a
는 할당 이후의 값이 완료 값이지만, var 문 자체의 완료 값은undefined
- 아래의 완료값은 ? ```javascript var b;
if (true) { b = 4 + 38; }
- 블록 내의 마지막 문 b = 4 + 38의 완료값이 42이므로 if 블록의 완료 값도 42를 반환
- 즉, ***블록의 완료값은 내부에 있는 마지막 문의 값을 암시적으로 반환한 값***
### II. 표현식의 부수효과
- 대부분의 표현식에는 부수효과가 없다.
- 다음의 함수 호출 표현식은 부수효과를 가진 표현식의 전형적인 예이다.
```javascript
function foo() {
a = a + 1;
}
var a = 1;
foo(); // 결괏값 : 'undefined', 부수 효과 : 'a'가 변경됨.
var a = 42;
var b = a++;
var a, b, c;
a = b = c = 42;
자바스크립트 문법 규칙 중에 같은 구문이지만 어디에서 어떤 식으로 사용하냐에 따라 서로 다른 의미를 가지는 경우가 있다.
{}
)가 나올만한 곳은 두군데이다. (객체 리터럴, 레이블){
foo: bar()
}
{}
는 평범함 코드 블록이다.{}
코드 블록은 for/while 루프, if 조건 등에 붙어있는 코드 블록과 기능적으로 매우 유사하다.foo: bar()
구문이 특이한 이유는 레이블문이기 때문foo: for (var i=0; i<4; i++) {
for (var j=0; j<4; j++) {
// 두 루프의 반복자가 같을 때마다 바깥쪽 루프를 continue 한다.
if (j == i) {
// 다음 순회 시 'foo' 붙은 루프로 점프한다.
continue foo;
}
// 홀수 배수는 건너뛴다.
if ((j*i)%2 == 1) {
// 평범한(레이블 없는), 안쪽 루프의 'continue'
continue;
}
console.log(i, j);
}
}
// 1 0
// 2 0
// 2 1
// 3 0
// 3 2
break foo는 “foo라는 레이블을 빠져나가 그 이후부터 계속하라”
[] + {}; // "[object Object]"
{} + []; // 0