개발/프론트

javascript identifier '변수명' has already been declared 해결 방법, switch문의 block-scope 변수 선언.

다당근 2023. 12. 20. 14:52

목차

     

     

    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 오류가 생기지 않는다.