목차
identifier 오류 내용
identifier '변수명' has already been declared
원인
1. ES5 까지는 var 를 사용했지만, ES6 부터는 var 대신 let 과 const 를 사용.
- var : 중복 선언 가능, 재할당 가능, 함수 레벨 스코프
- let : 중복 선언 불가능, 재할당 가능, 블록 레벨 스코프
- const : 중복 선언 불가능, 재할당 불가능, 블록 레벨 스코프
var | let | const | |
중복 선언 | O | X | X |
재할당 | O | O | X |
스코프 | 함수 레벨 | 블록 레벨 | 블록 레벨 |
- 블록 레벨 스코프 : 모든 코드 블록 ( 함수, if문, switch문, try/catch문 등 ) 내에 선언된 변수는 코드 블록 내부에서만 사용할 수 있다.
- 함수 레벨 스코프 : 함수 내에서 선언된 변수는 함수 내에서만 사용할 수 있으며 외부에서는 참조할 수 없다.
=> 재할당이 불가능한 let, const 를 사용하여 변수를 여러번 선언했을 때 발생.
중복 선언 해결 방법
1. let 또는 const 로 변수 여러번 선언 하지 않기.
let message = "안녕하세요.";
let message = "반갑습니다."; // 에러
const name = "당근";
const name = "판다"; // 에러
switch 문에서의 identifier 오류
잘못된 코드
switch(name){
case "당근":
let type = "채소";
...
break;
case "판다":
let type = "동물"; // 에러
...
break;
}
원인
let, const 는 블록레벨 스코프를 따른다.
위 코드에서는 중괄호가 case 문을 감싸고 있기 때문에,
case 문 안의 코드들은 단일 블록이 된다.
해결 방법
switch(name){
case "당근": {
let type = "채소";
...
break;
}
case "판다": {
let type = "동물"; // 에러
...
break;
}
}
이 처럼 case 문을 중괄호로 감싸게 되면 각 case 문별로 블록이 생기기 때문에 identifier 오류가 생기지 않는다.