클린코드
var X -> let & const!
var는 함수 스코프, let & const는 블록 스코프, TDZ를 피할 수 있다.
console.log(name) //undefined
var name = '이름';
var name = '이름2';
var name = '이름3';
var name = '이름3';
console.log(name) // 이름3
값이 다르지만 에러가 나지 않으며 가장 마지막에 할당한 게 나오며 먼저 console.log
를 사용했음에도 에러가 아닌 undefined
로 출력해버린다(호이스팅)
만약 우리가 작성하는 라인이 엄청나다고 생각하면 굉장히 곤란해진다
let
이나 const
를 사용하면 안전하게 사용 가능하다
스코프 차이
var global = '전역';
if(global =='전역){
var global = '지역'
console.log(global); //지역
}
console.log(global);//지역
위 상황에서 중괄호 안까지만 바뀌길 원했는데 전역까지 바꾼다. 함수단위 스코프이기 때문
블록단위로 해야 안전하다
let global = '전역';
if(global =='전역){
let global = '지역'
console.log(global); //지역
}
console.log(global);//전역
하지만 let
보다 const
가 좋은 이유 -> 재할당만 생각해보자면
const person ={
name : 'jang',
age:30
}
person = {
...
} // Assignment to constant variable
person.name = 'lee'
person.age == 20
console.log(person) // {name: 'lee',age:20}
재할당 금지 에러가 뜬다. 하지만 아래는 person을 재할당 하지 않고 값만 바꾼것이기 때문에 가능하다!
배열 또한 push메서드 등을 사용할 경우 가능하다. const
는 재할당만 금지! 객체 배열 조작할땐 이상이 없다
전역공간은 window
와 global
로 나누는데 각 브라우저와 node로 나눈다.
전역-> 최상위
간단히 index.js
와 index2.js
2개가 있는데 index.js
에서 전역 변수를 만들게 될 경우 index2.js
에서도 똑같이 사용 됨으로 서로 코드가 겹칠 위험성이 매우 커진다
파일을 나누면 스코프가 나뉘는 게 아니기 때문
요약
전역 공간을 최대한 사용 자제
-> 어디서나 접근 가능하며 스코프 분리 위험
어떻게??
1. 전역변수 X
2. 지역변수 O
3. window.global을 조작 X
4. const, let ok
5. IIFE, Module, closure 스코프를 나누기
function getElements() {
const result = {};
result.title = document.querySelector('.title')
result.text = document.querySelector('.text')
result.value = document.querySelector('.value')
return result;
}
의문이 생길 수 있다. const
를 사용했고 괜찮지 않나? 겠지만 이 함수 안에서 사용한 result
는 임시 객체도 함수가 커진다면 이 임시객체가 전역 변수와 비슷하게 변해버릴 수 있다.
함수를 잘게 쪼갠다면 상관없지만 그렇지 않다면 임시변수를 만드는 습관이 있다면 고치고 뜯어보자
function getElements() {
const result = {
title : document.querySelector('.title'),
text : document.querySelector('.text'),
value : document.querySelector('.value'),
};
return result;
}
이렇게 변환할 경우 좀 더 명확해지고 여기서 더 명확하게 하려면 그냥 객체 자체를 return
해버리는 방식도 있다
function getElements() {
return {
title : document.querySelector('.title'),
text : document.querySelector('.text'),
value : document.querySelector('.value'),
}
}
이러면 이 코드는 사이드 이펙트가 굉장히 적어진 코드가 될 수 있다.
임시 변수가 생기는 순간부턴 조작을 많이하고 반환만 하면 된다라는 유혹이 일어날 수 있는 것이다.
또는
function getDateTime(targetDate)}{
let month = targetDate.getMonth();
let day = targetDate.getDate();
let hour = targetDate.Hours();
month = month >= 10? month: '0'+month;
day = day >= 10? day: '0'+day;
hour = hour >= 10? hour: '0'+hour;
return {
month,day,hour
}
}
만약 이런 상황이 온다면 이후에 이 함수가 할 수 없는 추가적인 스펙 즉, 기획이나 마케팅적인 요소로 무언가 날짜에 대한 요구사항이 생겼을 때 어떻게 할 것인가?
1. 함수추가
2. 함수 유지 보수, 수정
-> 이 경우에 문제가 생길 수 있다. 함수가 여러군데 쓰일 수 있기때문에
function getDateTime(targetDate)}{
const month = targetDate.getMonth();
const day = targetDate.getDate();
const hour = targetDate.Hours();
return{
month : month >= 10? month: '0'+month,
day : day >= 10? day: '0'+day,
hour : hour >= 10? hour: '0'+hour,
}
}
function getDateTime(){
const currentDateTime = getDateTime(new Date())
....
}
등처럼 임시변수를 만들어 crud하는 상황을 줄이고 추상화를 통해 하나 나하나 함수를 씌우고 벗겨가며 구상해보자.
요약
임시변수를 제거
-> 명령형으로 가득한 로직이 나오며 어디서 어떻게 잘못됐는지 디버깅이 힘듬
-> 추가적인 코드를 작성하게 되는 유혹이 일어난다
해결
-> 함수나누기
-> 바로 반환
-> 고차함수(map,filter,reduce)
-> 선언형 프로그래밍 활용