이전에 작성한 var,let,const의 차이 (+scope,hoisting,변수 생성 단계) 에 이어 JS에서 변수를 다루는 가이드에 대해 한번 더 정리한 글
💡 const → let 순서대로 지향한다. var는 사용하지 않는 것이 좋다!
const는 재할당만 금지되고 조작에는 문제가 없어서 더 안전하다.
함수 레벨 스코프
재선언(중복선언), 재할당이 모두 가능하다.
var name = '김철수'
var name = '신짱구'
console.log(name) //'신짱구'
변수 호이스팅
name = '신짱구'
console.log(name)
var name = ''
블록 레벨 스코프
TDZ(Temporal Dead Zone) 속성을 가진다
호이스팅이 발생하지 않는 것처럼 동작한다.
console.log(name)
//ReferenceError
let name = '김철수'
재선언이 불가능하다.
let name = '김철수'
let name = '신짱구'
const age = 5
const age = 29
//재선언 불가, 에러 발생
let: 변수가 선언되어 있다면 재할당이 가능하다.
const: 재할당이 불가능하다.
const person = {
name:'신짱구',
age:'5',
}
person.name = '봉미선'
person.name = 29
//객체 자체가 아닌 내부의 값만 바꾸는 것이기 때문에 정상 동작이 가능하다.
person.push({
name:'신형만',
age:'35',
})
//person
var global = '전역'
if(global === '전역'){
var global = '지역'
console.log(global); //지역
}
console.log(global) //지역
⇒ if블록 안에서 변경된 내용이 if문 밖까지 영향을 미쳤다.
const global = '전역'
if(global === '전역'){
const global = '지역'
console.log(global); //지역
}
console.log(global) //전역
⇒ 블록 내에서의 변수와 블록 바깥의 변수가 독립적이다.
💡 전역 공간을 더럽히지 않기 위해 전역 공간 사용을 최소화 해야 한다.
전역에는 두 가지 종류가 있다.
window
(브라우저)global
(nodeJS)자바스크립트는 언어에 개입해서 내장 메서드를 수정할 수가 있다.
전역을 사용할 경우 언어에 의도치 않게 개입되며 전역 공간을 더럽힐 수 있다.
var setTimeout = ‘setTimeout'
⇒ setTimeout() 함수를 사용할 수 없게 된다.💡 임시변수 대신 바로 데이터를 반환하도록 { }로 묶어서 전달한다.
function getElements(){
const result = {};
result.title = document.querySelector('.title');
result.text = document.querySelector('.text');
result.value = document.querySelector('.value');
return result;
}
function getElements(){
return{
title:document.querySelector('.title'),
text:document.querySelector('.text'),
value:document.querySelector('.value')
}
}
최대한 사용하지 않는 방향을 추구해야 한다.임시변수를 사용하면 명령형으로 가득한 로직이 된다.
function getSomeValue(params){
let tempVal = '';
for(let index=0;index<array.length;index++){
temp = array[index];
temp += array[index];
temp -= array[index];
}
if(temp){
//...some code
}
return temp
}
→ 함수의 동작 예측이 어렵고 디버깅이 어려워진다.
→ 함수는 하나의 역할만 해야하는데, 추가적인 코드를 작성하고 싶은 유혹이 생긴다.
💡 런타임 시 함수 안에 있는 모든 선언들을 끌어올려 최상단에서 선언하는 것과 같은 현상, 그러나 실제로 코드가 끌어올려지는 것은 아니다.
let, const, class를 이용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작한다.
var는 호이스팅의 영향을 받는다. undefined가 할당되기 때문에 호이스팅의 영향으로 예측하지 못한 결과를 얻을 수 있다.
참조 에러가 난다고 호이스팅이 일어나지 않은 것이 아니다. 참조 에러가 나는 이유는 메모리에 공간만 생기고, 값을 초기화하지 않기 때문.
var를 사용하지 않는다.
함수를 만들 때 const로 변수를 선언하고 거기에 익명 함수를 할당하는 방법
(변수 선언 → 할당 → 초기화 완료 ⇒ 정확한 분리!)