식은 하나의 값으로, 일반 문은 실행 단위(레코드)로 등록되고 flow를 따른다.
flow control를 할 수 있는 문들을 이용하면, 레코드를 선택하거나 레코드를 순환할 수 있게 된다. 이런 문들을 completion record로 바뀐다.
문이 아니라 record에 달아주는 태그같은 것이므로 자체로는 문, 레코드가 될 수 없고 별다른 문이 없으면 에러가 난다.
레이블의 이름은 같은 스코프에 두개 등장할 수 없고 이는 컴파일 타임에 에러가 잡힌다.
스코프의 종류: 블록 스코프, 함수 스코프
label 스코프를 만들 수 있다. a:{}는 중문과는 또 다르다.
같은 함수 스코프 내에는 똑같은 이름의 레이블을 선언할 수 없다. 하지만 레이블 스코프 내에는 같은 이름의 레이블을 또 만들 수 있다.
일반적으로 레이블 스코프가 지정되지 않을 경우 다른 lablel이 등장하기 전 까지
auto label일 경우 레이블 스코프가 자동적으로 지정된다. iteration, switch위에 label을 작성하게 되면 그 문이 끝날 때까지로 레이블이 자동적으로 한정된다.
특정한 경우, label안에서는 그걸 빠져나오기 위한 flow control이 가능해지고(위로 이동하는 것은 불가능), break, 루프의 경우 switch도 가능해진다.
보통 label문에서는 break 뒤에 label이름을 적는데, for문 위에 auto label이 생성되고, break를 쓰면 뒤에 자동으로 break "auto label name"이 되어 작동한다.
switch + (식) + {}
하지만 if문이나 for문 뒤의 중괄호는 단문이 나와도 되어서 생략될 수 있었던 반면, switch문의 중괄호는 생략되면 안된다.
이유: switch문 중괄호는 special label block을 만들어주는 역할을 하기 때문이다. 이를 통해 컴파일 타임에 해석되는 정적인 레이블을 만드는 것이 아니라, 동적으로 해석할 수 있는 케이스 레이블을 사용할 수 있다.
자바에서는 switch문이 나오면 케이스와 문에 대한 맵을 생성하여서 default문을 앞에 두어도 해당되는 케이스만 수행된다. -> case label에 식이 들어가면 안 된다.
반면 자바스크립트는 case label에 식이 들어가도 런타임으로 평가가 가능하다.
값에 대한 평가, 값을 true를 통해 무력화시키고 case를 통해 평가(책임 연쇄 패턴)