자바스크립트 엔진은 세미콜론으로 문이 종료한 위치를 파악하고 순차적으로 하나씩 문을 실행한다.
단, 0개 이상의 문을 중괄호로 묶은 코드 블록({...})은 세미콜론을 붙이지 않는다. 이러한 코드 블록은 언제나 문의 종료를 의미하는 자체 종결성(self closing)을 가진다.
// 함수의 자체 종결성functionadd(a, b) {
return a + b; // return 문으로 함수 종료
}
// 조건문의 자체 종결성let x = 10;
if (x > 5) {
console.log('x는 5보다 큽니다.');
} else {
console.log('x는 5보다 작거나 같습니다.');
}
// 반복문의 자체 종결성for (let i = 0; i < 5; i++) {
console.log(i);
if (i === 3) {
break; // 반복문 중단
}
}
자바스크립트 엔진은 소스코드를 해석할 때 문의 끝이라고 예측되는 지점에 세미콜론을 자동으로 붙여주는 세미콜론 자동 삽입 기능(ASI:automatic semicolon insertion)을 수행하기 때문에 세미콜론은 생략이 가능하다.
하지만 동작을 제대로 예측하지 못하는 아래와 같은 경우가 발생할 수 있다.
functionfoo () {
return
{}
// ASI의 동작 결과 => return; {};// 개발자의 예측 => return {};
}
console.log(); // undefinedvar bar = function () {}
(function() {})();
// ASI의 동작 결과 => var bar = function () {}(function() {})();// 개발자의 예측 => var bar = function () {};(function() {})();// TypeError: (intermediate value)(...) is not a function
이와 같은 이유로 ESLint 같은 정적 분석 도구에서도 세미콜론 사용은 기본으로 설정하고 있고, TC39(ECMAScript 기술 위원회)도 세미콜론 사용을 권장한다.
// 변수 선언문은 값으로 평가될 수 없으므로 표현식 Xvar x;
// 표현식이면서 완전문이다.
x = 1 + 2;
표현식과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다.
// 표현식이 아닌 문은 값처럼 사용할 수 없다.var foo = var x; // SyntaxError: Unexpected token var// 변수 선언문은 표현식이 아닌 문이다.var x;
// 할당문은 그 자체가 표현식이지만 완전한 문이기도 하다.
x = 100;
// 표현식인 문은 값처럼 사용할 수 있다.var foo = x = 100;
console.log(foo); // 100
⭐️ 완료 값(completion value)
크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력한다. 이를 완료 값이라 한다. 완료 값은 표현식의 결과가 아니다. 따라서 다른 값과 같이 변수에 할당할 수 없고 참조할 수도 없다. 표현식이 아닌 문을 실행하면 완료 값 undefined가 출력됨
크롬 개발자 도구에서 표현식인 문을 실행하면 언제나 평가된 값을 반환한다.
표현식과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다.
// 표현식이 아닌 문은 값처럼 사용할 수 없다.
var foo = var x; // SyntaxError: Unexpected token var
// 변수 선언문은 표현식이 아닌 문이다.
var x;
// 할당문은 그 자체가 표현식이지만 완전한 문이기도 하다.
x = 100;
// 표현식인 문은 값처럼 사용할 수 있다.
var foo = x = 100;
console.log(foo); // 100
⭐️ 완료 값(completion value)
크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력한다. 이를 완료 값이라 한다. 완료 값은 표현식의 결과가 아니다. 따라서 다른 값과 같이 변수에 할당할 수 없고 참조할 수도 없다. 표현식이 아닌 문을 실행하면 완료 값 undefined가 출력됨
크롬 개발자 도구에서 표현식인 문을 실행하면 언제나 평가된 값을 반환한다.