| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 마스킹
- 미니프로젝트
- channels
- js
- 2주차
- resnet50
- 백준
- WIL
- 채팅
- 장고
- 1주차
- vscode
- 개발일지
- 프로그래머스
- 프로젝트
- 알고리즘
- re-id
- sql
- 정보처리기사실기
- poetry
- 정보처리기사
- 파이썬
- Git
- Class
- WebSocket
- REDIS
- WHERE절
- github
- Commpot
- 가상환경
- Today
- Total
개발일기
[JS error] Uncaught SyntaxError : Identifier '변수명' has already been declared (에러 해결하면서 살펴보는 const, var, let의 차이) 본문
[JS error] Uncaught SyntaxError : Identifier '변수명' has already been declared (에러 해결하면서 살펴보는 const, var, let의 차이)
츄98 2023. 5. 13. 19:41
원인: feed_id를 다른데서 const 불변형 변수로 선언했기 때문!!
변수명을 바꿔주면 해결된다!!
Parsing error: Identifier '변수명' has already been declared. 해결 방법
Parsing error: Identifier '변수명' has already been declared. 해결 방법에 대하여 알아보겠습니다. 이 에러는 Javscript ES6이상을 사용하면 어디서든 발생할 수 있는 에러입니다. 따라서, Javscript뿐만 아니라 Jav
itprogramming119.tistory.com
이렇게 된거... const와 var 그리고 let의 차이를 한 번 훑고 가자!!
1. var : 중복 선언 가능
- 동일한 이름으로 여러 번 중복해서 선언이 가능하다.
- 마지막에 할당된 값이 변수에 저장이 된다.
- 장점: 필요할 때마다 변수를 유연하게 사용할 수 있다.
- 단점: 기존에 선언해둔 변수의 존재를 잊고 값을 재할당하는 등의 실수가 발생할 가능성이 크다.
- 코드량이 많아졌을 때, 같은 이름의 변수명이 여러 번 선언되었다면 어디서 문제가 발생했는지 파악하기 힘들고 값이 바뀔 우려도 있다..!!
var name = 'bar';
console.log(name); // bar
var name = 'foo';
console.log(name); // foo
- SCOPE (유효한 참조 범위)
- 함수 내에서 선언된 변수는 함수 내에서만 유효하며, 함수 외부에는 참조할 수 없다.
- 함수 내부에서 선언한 변수는 지역 변수, 나머지는 전역 변수 간주한다.
- 자바스크립트애서는 if문, for문, while문, try/catch 문 등의 코드 블럭{ ... } 내부에서 var로 선언된 변수를 전역 변수로 간주한다. 그래서 블럭 외부에서도 어디에서나 참조할 수 있다.
- Hoisting (호이스팅) : 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것
- var로 선언한 변수의 경우 호이스팅 시 undefined로 변수를 초기화한다.
- JavaScript는 초기화를 제외한 선언만 호이스팅한다.
- 변수를 먼저 사용하고 그 후에 선언 및 초기화가 나타나면, 사용하는 시점의 변수는 기본 초기화 상태(var 선언 시 undefined, 그 외에는 초기화하지 않음)
- 변수 생성 과정은 선언 단계(Declaration phase) => 초기화 단계(Initialization phase) => 할당 단계(Assignment phase) 이렇게 총 세 단계를 거쳐 생성되는데, var로 선언된 변수는 선언 단계에서 undefined를 할당하는 과정(초기화 과정)이 한 번에 진행되어서 변수 선언 전 호이스팅이 가능하다.
console.log(num); // 호이스팅한 var 선언으로 인해 undefined 출력
var num; // 선언
num = 6; // 초기화
// 선언 없이 초기화만 존재하는 경우, ReferenceError 예외가 발생
console.log(num); // ReferenceError
num = 6; // 초기화
2. let : 중복 선언 불가능, 재할당 가능
- 중복 선언은 안 되지만, 변수 선언 및 초기화 이후 반복해서 다른 값을 재할당할 수 있다.
- let은 변수를 선언할 시 할당을 반드시 하지 않아도 된다.
let name;
console.log(name)'; // undefined
let name = 'bar';
console.log(name); // bar
let name = 'foo'
console.log(name);
// Uncaught SyntaxError: Identifier 'name' has already been declared
// 중복 선언 안 됨
name = 'baz';
consol.log(name); // baz
// 재할당은 가능
- SCOPE (유효한 참조 범위)
- 함수, if문, for문, while문, try-except문 등 코드 블록 내부에서 선언된 변수는 코드 블록 ({...}) 내에서만 유효하며 외부에서는 참조할 수 없음.
- 코드 블록 내부에서 선언한 변수는 지역 변수로 취급된다.
- Hoisting (호이스팅) : 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것
- let으로 선언한 변수도 호이스팅 대상이지만, var과 달리 호이스팅 시 undefined로 변수를 초기화하지 않는다.
- 변수의 초기화를 수행하기 전에 읽는 코드가 먼저 나타나면 참조 오류(에러)가 발생합니다.
- 변수 생성 과정은 선언 단계(Declaration phase) => 초기화 단계(Initialization phase) => 할당 단계(Assignment phase) 이렇게 총 세 단계를 거쳐 생성되는데, let은 선언 단계에서 초기화 과정(메모리 공간 확보)이 이루어지지 않기 때문에 선언 이전에 변수를 참조할 수 없다.
console.log(num) // Error: Uncaught ReferenceError: num is not defined
let num = 6
3. const : 중복 선언 불가능, 재할당 불가능
- 한번 선언을 하면 값을 바꿀 수 없다.
- 변수에 값을 한 번 할당하게 되면 바꿀 수 없기 때문에 변수를 선언할 시 할당이 반드시 이루어져야 한다.
- 하지만, 배열과 오브젝트의 값을 변경하는 것은 가능하다.
const name;
console.log(name); //SyntaxError: Missing initializer in const declaration
const name = 'bar';
console.log(name); // bar
const name = 'foo';
console.log(name);
// Uncaught SyntaxError: Identifier 'name' has already been declared
name = 'baz';
console.log(name);
// Uncaught TypeError: Assignment to constant variable
// 중복 선언도 안되고 재할당도 안 된다. 하지만, 배열과 오브젝트 값을 바꾸는 건 가능하다.
function func() {
const list = ["A", "B", "C"]
list.push("D");
console.log(list);
// ["A", "B", "C", "D"]
}
- SCOPE (유효한 참조 범위)
- 함수, if문, for문, while문, try-except문 등 코드 블록 내부에서 선언된 변수는 코드 블록 ({...}) 내에서만 유효하며 외부에서는 참조할 수 없음.
- 코드 블록 내부에서 선언한 변수는 지역 변수로 취급된다.
- Hoisting (호이스팅) : 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것
- const로 선언한 변수도 호이스팅 대상이지만, var과 달리 호이스팅 시 undefined로 변수를 초기화하지 않는다.
- 변수의 초기화를 수행하기 전에 읽는 코드가 먼저 나타나면 참조 오류(에러)가 발생합니다.
결론 1: const를 기본으로 사용하여 불필요한 변수의 재사용을 방지하되, 재할당이 필요한 경우 let을 사용하는 것이 좋다..!!! var는 사용하지 않기!!!
결론 2:
1. const - 변수의 중복 선언, 재할당 모두 불가능하며, 변수를 선언하기 전에 참조할 수 없다. 변수 선언 시 할당을 반드시 해야 한다.
2. var - 변수의 중복 선언, 재할당 모두 가능하며, 호이스팅이 되어 변수를 선언하기 전에 참조할 수 있다.
3. let - 변수의 중복 선언은 불가능하나 재할당은 가능하다. 변수를 선언하기 전에 참조할 수 없으며 변수 선언 시 할당을 반드시 할 필요는 없다.
결론 3:
var는 함수 내부에 선언된 변수만 지역 변수로 인정하는 함수 레벨 스코프이다.
let, const는 모든 블록 내부에서 선언된 변수까지 지역변수로 인정하는 블록 레벨 스코프이다.
참고자료:
https://developer.mozilla.org/ko/docs/Glossary/Hoisting
호이스팅 - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN
JavaScript에서 호이스팅(hoisting)이란, 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미합니다. var로 선언한 변수의 경우 호이스팅 시 undefined로 변수를 초기화합니다
developer.mozilla.org
https://gist.github.com/LeoHeo/7c2a2a6dbcf80becaaa1e61e90091e5d
javascript var, let, const 차이점
javascript var, let, const 차이점. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
📚 var / let / const 차이점 정리 (변수 호이스팅)
자바스크립트 var / let / const 차이점 5가지 중복 선언 가능 여부 재할당 가능 여부 변수 스코프 유효범위 변수 호이스팅 방식 전역객체 프로퍼티 여부 1. 중복 선언 가능 여부 var : 중복해서 선언(+
inpa.tistory.com
'오늘의 공부일기 > JS 공부일기' 카테고리의 다른 글
| [400 Bad request error] 이미지를 넣지 않아도 프로필 수정하기 (0) | 2023.05.15 |
|---|---|
| [HTTP 에러] 415 Unsupported Media Type 에러 (0) | 2023.05.14 |