> For the complete documentation index, see [llms.txt](https://simian114.gitbook.io/blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://simian114.gitbook.io/blog/undefined/javascript/undefined-2/....md).

# 식과 문이란 무엇인가...

## 식.. 간단히 살펴보자

식은 **expression**이라고 한다. 간단히 말해 **하나의 값**이 되는 것. 여기서 값이란 기본값은 물론 객체 등의 참조값도 포함이 된다.

자바스크립트가 **인정하는 식**에는

1. **값 식**: 값 자체도 식으로 인정
2. **연산식**: 연산자가 포함된 경우 결과는 반드시 하나의 값이 되어 **최종적으로는 값 식**이 된다.
3. **리터럴**: 리러털은 대부분 객체 생성을 위한 일종의 매크로임. 리터럴의 결과는 참조값이 된다.

   ```
   {} // 오브젝트 리터럴
   function(){} // 함수리터럴
   [] // 배열리터럴
   /abcd/ // 정규식 리터럴
   ```
4. **함수호출**: 함수를 호출한 결과는 값이 된다. 자바는 void 를 반환하면 값이 될 수 없지만, JS 는 명시적으로 값을 반환하지 않아도 **undefined** 가 반환되어 **언제나 값으로 수렴된다.**

위 4종류를 자세히 읽어보면 알겠지만, **모든 식은 오직 값 식 만이 존재한다.** 결론적으로 다른 모든 식은 하나의 값에 수렴하여 값 식이 되는 것이므로 **값 == 식** 으로 이해하자.

## **문.. 간단히 살펴보자**

문이란 **statement** 라 한다. 의미 상으로 인터프리터에게 내리는 지시문이라 할 수 있다.

**따라서 문은 파싱된 이후에 아무것도 남지 않게 되므로 값으로 쓸 수 없다.**

```
var a = if (b) return 3; // 에러!!
```

위의 코드는 에러가 발생한다. 왜 에러가 발생하는지 설명할 수 있나?

위에서 사용한 **if (식) 문;** 형식은 미리 인터프리터에 정의된 **제어문** 이다. **if 문은 식이 참일 때 지정된 문을 실행하도록 되어있는 인터프리터를 위한 지시자 일 뿐 어떠한 값도 될 수 없다.**

따라서 위의 예시와 같이 **a에 if 를 할당하려고해도 아무것도 없으므로 할당이 불가능하다.**

**문 은 당연하게도 인터프리터의 파싱 규칙 그 자체이므로 언어 규격 상 매우 엄격하게 정의되어 있다.** 자바스크립트에서 허용되는 문은 다음과 같다.

1. **제어문**: 미리 엄격하게 정의된 형식의 문 들이다. ex) if, if else, switch, for, for in, while, do while, case, label, continue, break, return, var, try, catch
2. **공문(빈문)**: 아무것도 없는 문도 문으로 인정한다. while 문은 **while (식) 문 ;** 와 같은 형태인데 아래와 같은 구문에서 **문이 비어있는 공문이기** 때문에 에러가 발생하지 않는다.

   ```
   while (i--) // 식은 있지만, 문은 없는 공문이다. 하지만 에러 발생x
   ```
3. **식문**: **자바스크립트의 가장 큰 특징. 식을 문으로 인정한다.** 식은 값이므로 값문 이라고 해도 무방함. 따라서 아래와 같은 식문이 전부 정상적으로 사용이 가능하다.

   ```
   3;          // 식문
   'aaa';      // 식문
   func();     // 식문
   {a: 'test'};// 식문
   3+5;        // 식문
   ```

문 자체는 단일한 하나의 문장이다. 하지만, **중괄호로 묶어 마치 하나의 문처럼 사용할 수 있는데 이를 중문이라고 한다.** (단 한줄로 된 상대적인 개념은 단문이라고 한다.)

다양한 제어문에서 문이 올 자리는 단문 또는 중문이 올 수 있다. if 문의 경우 **if (식) 문;** 의 형태인데, 아래와 같이 단문도 올 수 있고 중문 또한 올 수 있다.

```
if (3) 5; // 5는 값식 ==> 식문 으로 성립!
​
if (1) {  // if(값식) 중문 {식문; 식문;} 으로 성립!
  5;
  6;
}
```

**자바나 c계열에서는 중문을 만들면 변수의 스코프도 동시에 생성되어 지역변수 개념이 생긴다**. **JS 에서는 변수란 해시맵의 KEY 이므로 함수를 통한 스코프객체를 만들어야 변수를 쓸 수 있다. 따라서 단지 중문을 생성한 것만으로는 지역 스코프가 생성되지 않는다!!!**
