block
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
블록문(또는 다른 언어에서는 복합문)은 0개 이상의 구문을 묶을 때 사용합니다. 블록은 한 쌍의 중괄호로 구성하며 선택적으로 레이블을 붙일 수 있습니다.
시도해보기
문법
블록문
{
StatementList;
}
레이블된 블록문
LabelIdentifier: {
StatementList;
}
StatementList
-
블록문 내의 구문.
LabelIdentifier
설명
예제
엄격하지 않은 모드에서 변수 또는 함수 선언의 블록 범위 규칙
var
사용 시
var
로 선언한 변수는 블록 범위를 가지지 않습니다.
블록 내에서 선언한 변수의 범위는 함수나 스크립트가 되어, 값 할당의 영향이 블록 바깥까지 미칩니다.
다른 말로는 블록문이 범위를 만들지 않습니다.
"독립" 블록문도 유효한 구문이긴 하지만, C와 Java의 블록에 기대하는걸 JavaScript에서도 기대하면 안됩니다.
예를 들어보겠습니다.
엄격하지 않은 모드에서 var
로 선언한 변수 혹은 함수 선언에 의해 생성된 변수는 블록 범위를 가지지 않습니다.
블록 내에서 선언한 변수는 이 변수를 포함한 함수나 스크립트까지 범위가 지정되며, 변수의 설정 효과는 블록을 넘어서도 지속됩니다. 즉, 블록문에 범위가 도입되지 않습니다. 예:
var x = 1;
{
var x = 2;
}
console.log(x); // 콘솔에 2를 출력합니다
콘솔 출력 결과는 2입니다. 블록 안의 var x
과 블록 앞의 var x
문과 동일한 범위에 있기 때문입니다.
엄격하지 않은 코드에서는, 블록 내부의 함수 선언이 이상하게 동작합니다. 사용하지 마십시오.
엄격 모드에서 let, const 혹은 함수 선언의 범위 규칙
반면 let
과 const
로 선언한 식별자는 블록 범위를 가집니다.
let x = 1;
{
let x = 2;
}
console.log(x); // 1이 콘솔에 찍힙니다.
x = 2
는 선언한 블록으로 범위가 제한됩니다.
const
도 마찬가지입니다.
const c = 1;
{
const c = 2;
}
console.log(c); // 1이 콘솔에 찍히며, SyntaxError 예외가 발생하지 않습니다.
블록 내의 const c = 2
가 SyntaxError: Identifier 'c' has already been declared
를 던지지 않는 점에 주목하세요. 블록
범위 안이라 별개의 식별자이기 때문입니다.
ES2015의 엄격 모드부터, 블록 내의 함수는 해당 블록으로 범위가 제한됩니다. ES2015 이전의 엄격 모드에서는 블록 레벨 함수를 사용할 수 없었습니다.
명세
Specification |
---|
ECMAScript Language Specification # sec-block |
브라우저 호환성
BCD tables only load in the browser