728x90
반응형
⚡var
var로 선언한 변수는 동일한 이름으로 여러번 중복 선언이 가능하며 마지막에 할당된 값이 변수에 저장된다.
변수를 유연하게 사용할 수 있다는 장점이 될수 있지만 기존 선언된 내역을 망각하여 재 선언을 하여 값이 다르게 출력될수 있는 케이스가 발생할수 있다.
var lanType = 'javascript';
console.log(lanType); // javascript
var lanType = 'java';
console.log(lanType); // java
------------------------------------------------------------------------------------
var str = "mrbang";
function newFunction() {
var typeStr = "hello";
}
console.log(typeStr); // error: typeStr is not defined
⚡let (중복 선언 불가능, 재할당 가능)
var과 다르게 let은 해당 변수가 이미 선언되었다는 메시지를 출력됨에 따라 중복선언이 불가능함을 알수 있다.
langType = 'vue'; 라고 재할당은 가능한 부분을 알수있다.
let lanType = 'javascript';
console.log(lanType); // javascript
let lanType = 'java';
console.log(lanType);
// Uncaught SyntaxError: Identifier 'lanType' has already been declared
lanType = 'vue';
console.log(lanType); // vue
⚡const(중복 선언 불가능, 재할당 불가능)
const lanType = 'javascript';
console.log(lanType); // javascript
const lanType = 'java';
console.log(lanType);
// Uncaught SyntaxError: Identifier 'name' has already been declared
lanType = 'vue';
console.log(lanType);
// Uncaught TypeError: Assignment to constant variable
const는 constant(상수)를 뜻하기에 한번 선언만 가능하고 값 변경이 불가합니다. 하지만 배열과 오브젝트에서는 값의 변경이 가능합니다.
function constFunction() {
const conList = ["A", "B", "C"]
conList = "D";
console.log(conList);
// TypeError: Assignment to constant variable
conList.push("D");
console.log(conList); // ["A", "B", "C", "D"]
}
⚡스코프(Scope) - 스코프란 유효한 참조 범위를 뜻하며, 기존의 방법인 var로 선언한 변수와 let & const로 선언한 변수의 스코프는 다르다.
🌱var : 함수레발 스코프(function-level scope)
함수 내에 선언된 변수는 함수내에서만 유효하며 함수 외부에서 참조 불가, 즉 함수 내부에서 선언한 변수는 지역변수 이고함수 외부에서 선언한 변수는 모두 전역변수로 취급
function letFunction() {
if (true) {
var a = 5;
console.log(a); // 5
}
console.log(a); // 5
}
letFunction(); // 5
console.log(a); // ReferenceError: a is not defined
🌱let, const : 블록 레벨 스코프(block-level scope)
함수 if, for, while, try/catch등의 모든 코드블록 내부에 선언된 변수는 코드블록 내에서만 유효하며 코드블록 외부에서 참조 불가!!!! 즉, 코드블록 내부에 선언한 변수는 지역 변수로 취급
function letconstFunction() {
if (true) {
let a = 5;
console.log(a); // 5
}
console.log(a); // ReferenceError: a is not defined
}
console.log(a); // ReferenceError: a is not defined
⚡호이스팅(Hoisting)
🌱호이스팅이란 함수 내부에 있는 선언들을 모두 끌어 올려 해당 함수 유효 범위의 최상단에 선언하는 것을 말하며 실제로 코드가 올라가지는 것이 아닌 자바스크립트 Parser가 함수 실행 전 해당 함수를 한번 확인 하는 과정에서 내부적으로 끓어올리는 걸 말하며 실제 메보리에서 변화는 없습니다.
🌱var 함수 선언문 : 호이스팅 발생함
/* 변수 호이스팅 */
console.log(hoistingStr); // undefined
var hoistingStr = 5;
console.log(hoistingStr); // 5
// 변수 hoistingStr가 선언되기 전에 참조되었음에도 에러 미발생, 이는 코드 실행 전 자바스크립트
내부에서 미리 변수를 선언하고 undefined로 초기화를 하기때문에 에러 미발생
🌱let, const 함수표현식 : 호이스팅이 발생하지만, 다른 방식으로 작동
/* 변수 호이스팅 */
console.log(hoistingStr); // ReferenceError: hoistingStr is not defined
let hoistingStr = 5;
console.log(hoistingStr); // 5
/* 함수 호이스팅 */
hoistingFunction(); // error
var hoistingFunction = function() {
console.log("hoistingFunction");
}
// 변수 hoistingStr이 선언되기 전 참조하니 에러 발생 이는 호이스팅이 발생한것이 아닌
변수의 선언과 초기화 사이에 일시적으로 변수 값을 참조할 수 없는 TDZ(Temporal Dead Zone)구간에
빠졌기 때문에 미출력
// 함수표현식을 사용하거나 let, const로 변수를 선언하는 경우 자바스크립트 내부에서 코드 실행 전
변수 선언만 해둘분 초기화 코드는 실행과정에서 변수 선언문을 만날때 수행하게 된다.
이에 다라 호이스팅이 발생하기는 하지만 값을 참조할 수 없기 때문에 동작하지 않는 것처럼 보임
let | const | var | |
유효범위 | Block Scope | Block Scope | Function Scope |
값 재정의 | 🙆 | ❌ | 🙆 |
재선언 | ❌ | ❌ | 🙆 |
728x90
반응형
'💚04_HTML5 & Javascript & CSS > 01_Javascript' 카테고리의 다른 글
#javascript #script태그 #페이지로딩속도 #async/defer 어트리뷰트 #sciprt태그위치는? (0) | 2024.07.16 |
---|---|
#removeEventListener #스크롤이벤트체크 #이벤트체크메소드 #약관동의 #스크롤 (0) | 2024.05.23 |
#javascript #함수 #filter #find #구분 (0) | 2023.11.16 |
#window. #window.location #reload #페이지이동 (0) | 2023.11.07 |
#JavaScript #날짜계산 #getFullYear() #getMonth() #getDate() #getDay() (0) | 2023.10.04 |
댓글