자바스크립트는 문과 표현식을 모두 가진 문장 언어이다.
프로그래밍 언어는 표현 언어(expression language)와 문장 언어(statement language)로 나눌 수 있습니다. 문장 언어는 문장과 표현식을 가지고 있지만, 표현 언어는 표현식만 가지고 있습니다. …자바스크립트를 포함한 대부분의 인기 있는 언어들은 문장 언어입니다.
더글러스 크락포드 , 『자바스크립트는 왜 그 모양일까?』, 인사이트(2020), p127.
문과 표현식은 서로 다른 개념이다.
문(Statement)과 표현식(Expression)을 대충 같은 의미라고 넘겨버리는 개발자가 허다하다. 그러나 자바스크립트에서 두 용어는 아주 중요한 차이가 있으므로 명확하게 분별하자.
카일 심슨 , 『You Don’t Know JS - 타입과 문법, 스코프와 클로저』, 한빛미디어(2017), p150.
문(Statement)은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다.
문은 문장(Sentence), 표현식은 어구(Phrase)에 해당된다고 볼 수 있다.
const a = 3 * 6;
b;
위 예시에서 3 * 6 은 표현식이며, 위 아래 모두 표현식이 포함된 문으로 볼 수 있다. 위의 경우 변수를 선언 하므로 선언문(Declaration Statement)이라고 한다.
표현식(expression)은 값으로 평가될 수 있는 문(statement)이다. 즉, 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
이웅모 , 『모던 자바스크립트 Deep Dive』, 위키북스(2020), p52.
var x; // 이와 같은 변수 선언문은 표현식이 아닌 문이다.
x = 100; // 할당문은 그 자체가 표현식이면서 완벽한 문이다.
자바스크립트에서는 문장 위치에 어떤 표현식을 쓰든 상관없습니다. 조잡하지만, 인기가 많은 언어 설계 방식이죠. 문장이 올 자리에 쓰기 좋은 세 가지 자바스크립트 표현식으로는 할당문, 호출문, delete가 있습니다. 아쉽게도 자바스크립트에서는 이 세 가지 외 다른 모든 종류의 표현식을 문장 위치에 쓸 수 있기 때문에 컴파일러가 에러를 찾아내기가 쉽지 않습니다.
더글러스 크락포드 , 『자바스크립트는 왜 그 모양일까?』, 인사이트(2020), p130.
let square = function(x) { return x * x; };
function square (x, log) {
log?.(x); // 함수를 받은 경우에만 호출
return x * x;
}
자바스크립트의 eval( ) 함수는 문자열을 인자로 받아들여 실행 시점에 문자열의 내용을 코드의 일부분처럼 처리한다. 즉, 처음 작성한 코드에 프로그램에서 생성한 코드를 집어넣어 마치 처음 작성될 때부터 있던 것처럼 실행한다.
카일 심슨 , 『You Don’t Know JS - 타입과 문법, 스코프와 클로저』, 한빛미디어(2017), p208.
동적으로 문자열을 평가해 소스 코드로 바꾸는 것은 지나치게 강력한 기능이며, 현실에서는 (거의) 절대 필요하지 않습니다. 만약 eval( )을 사용하고 있다면, 정말로 필요해서 사용하고 있는지 심사숙고해야 합니다. 특히 eval( )은 보안 허점을 만듭니다. 사용자가 입력한 문자열을 eval( )에 전달해서는 절대 안 됩니다.
데이비드 플래너건 , 『자바스크립트 완벽 가이드』, 인사이트(2022), p101.
References
데이비드 플래너건 , 『자바스크립트 완벽 가이드』, 인사이트(2022)
더글러스 크락포드 , 『자바스크립트는 왜 그 모양일까?』, 인사이트(2020)
카일 심슨 , 『You Don’t Know JS - 타입과 문법, 스코프와 클로저』, 한빛미디어(2017)
이웅모 , 『모던 자바스크립트 Deep Dive』, 위키북스(2020)