ES2015 전에는 var를 사용하는 것이 변수를 선언하는 유일한 방법이었다.
하지만 이제는 더 나은 기능을 제공하는 몇 가지 변수 선언 방법이 추가되었다.
const
const는 값을 변경할 수 없는 변수이다.
우리가 작성하는 자바스크립트 코드에서는 변경해서는 안 되는 변수가 많다.
const name = "JS";
name = true;
console.log(name); // Error
let
js에서 구문적인 변수 영역 규칙을 지원한다.
let은 값을 변경할 수 있는 변수이고, 지역변수로 사용 가능하다.
js에서는 중괄호를 사용해 코드 블록을 만든다.
const title = "js";
if (title) {
let title = "python";
console.log(title); // python
}
console.log(title); // js
let 키워드를 사용하면 변수의 영역을 코드 블록 안으로 한정시킬 수 있다.
let을 사용하면 블록 안에서 글로번 변수를 보호할 수 있다.
let을 사용해 루프 카운터 변수 i의 영역이 블록으로 제한되어 각 박스를 클릭하면 해당 박스를 루프에서 생성할 때 사용한 i 값이 정상적으로 표시된다.
const container = document.getElementById("container");
let div;
for (let i = 0; i < 5; i++) {
div = document.createElement('div');
div.onClick = function() {
alert("this is box #" + i)
};
container.appendChild(div);
}
문자열
템플릿 문자열은 공백(빈칸뿐 아니라 탭이나 개행 문자 등을 포함)을 유지한다.
그렇기 때문에 문자열 덩어리 그 자체로 참조가 가능하다.
함수 선언
함수 정의는 function 키워드로 시작하고, 그 뒤에 함수 이름이 온다. 문장은 중괄호 사이에 들어간다. 일반적인 함수 선언 방식이다.
function Hello() {
console.log("Hello")
}
함수를 만드는 다른 방법으로는 함수 표현식이 있다
const Hello = function() {
console.log("Hello")
};
이 둘은 차이점이 있는데 함수 선언을 하기 전에 함수를 호출해도 되지만, 함수 표현식에 의해 만들어진 함수를 함수 표현식이 실행되기 전에 호출할 수 없다.
hi();
const hi = function() {
console.log("hi");
} // Error
일반적인 함수 선언 방식이 더 전역적이라고 할 수 있다.
디폴트 파라미터
ES6 명세에는 디폴트 파라미터가 추가되었다.
const defaultInfo = {
name: {
first: "H",
last: "JS",
},
favActivity: "gotogym",
};
function Activity(a = defaultInfo) {
console.log(`${a.name.last}는 ${a.favActivity}을 즐겨합니다.`);
}
화살표 함수
화살표 함수를 사용하면 function 키워드 없이도 함수를 만들 수 있다. 화살표 함수에서는 return을 사용하지 않아도 식을 계산한 값이 자동으로 반환된다.
const myName(firstName, lastName) {
return `${firstName} ${lastName}`;
}
const myName = (firstName, lastName) => `${firstName} ${lastName}`;
함수가 파라미터를 단 하나만 받는 경우 파라미터 주변의 괄호를 생략해도 된다.
화살표 함수는 새로운 this 영역을 만들어내지 않는다.
일반 함수는 this를 새로 바인딩 한다.
const food = {
menu: ["김밥", "라면", "돈까스", "우동", "카레"],
print: function(delay = 1000) {
setTimeout(function() {
console.log(this.menu.join(","));
}, delay);
}
};
// Error
food.print(); // Cannot read property 'join' of undefined
이 오류는 this.menu의 join 메서드를 호출하려고 시도했기 때문에 발생했다.
this는 window 객체이다.
print 프로퍼티를 정의하는 function(delay=1000) {...}의 본문 안에서는 this가 menu의 객체인 반면, 그 프로퍼티 안에서 setTimeout을 호출하면서 정의한 function() {...}의 this는 window 객체이다.
const food = {
menu: ["김밥", "라면", "돈까스", "우동", "카레"],
print: function(delay = 1000) {
setTimeout(() => {
console.log(this.menu.join(","));
}, delay);
}
};
food.print(); // 김밥, 라면, 돈까스, 우동, 카레
다시말해, 화살표 함수는 새로운 this 영역을 만들어내지 않고 제대로 유지된다.