ES6 이전에는 함수 선언문과 함수 표현식이 있었다.
- 함수 선언식 :
function
키워드를 사용하여 함수를 선언하는 방식.- 함수 표현식 : 이름이 없는 익명함수를 변수에 할당하는 방식.
ES6에서 화살표 함수가 생겼다.
화살표 함수는 function
키워드 대신 화살표 (=>) 를 사용해 보다 간결하게 함수를 선언할 수 있게 되었다.
// 함수 선언문
function sayHi(name) {
console.log(`Hello! ${name}`);
}
// 화살표 함수
const sayHi = (name) => {
console.log(`Hello! ${name}`);
}
함수의 매개변수가 1개라면 소괄호()를 생략할 수 있다.
함수 바디가 한 줄이라면 중괄호와 return 문을 생략할 수 있다. (암묵적으로 return 됨.)
const func1 = num => `입력한 숫자는 ${num}이다.`
화살표 함수는 익명 함수로만 사용할 수 있기 때문에 호출하기 위해서는 함수 표현식을 사용해야한다.
// 함수 표현식
let squareWidth = function (x,y) { return x * y };
console.log(squareWidth(10,20)); // 200
// 화살표 함수
let squareWidth = (x,y) => x * y;
console.log(squareWidth(10,20)) // 200
return
지시자를 사용해 명시적으로 결과값을 반환해줘야한다.
return
으로 결과값을 반환해야한다. 그렇지 않을 경우 undefined
출력된다.
// return 사용x
let squareWidth = (x,y) => {x * y};
console.log(squareWidth(10,20)); // undefined
// return 사용
let squareWidth = (x,y) => { return x * y };
console.log(squareWidth(10,20)); // 200
화살표 함수는 다음과 같은 특징을 가지며 일반 함수와 달리 화살표함수에는 몇 가지 제한점이 있어 모든 상황에 사용할 수는 없다.
- 무조건 익명함수로만 사용가능.
- 메서드나 생성자 함수로 사용불가.
- 스스로의
this
,argument
를 가지지 않는다.- 함수가 정의된 스코프에 존재하는
this
를 가리킨다.- 화살표 함수는 생성될 때
this
가 결정된다.
// 메서드 const character = { name: 'haewon', sayHi: () => console.log(this.name); } character.sayHi(); // undefined
sayHi()
메서드의this
는 자신을 호출한 객체 character가 아닌 함수 선언 시점의 상위 스코프인 전역 객체를 가리킨다.// 생성자 함수 const charcter = () => {}; const charcter1 = new charcter(); // Uncaught TypeError: charcter is not a constructor
화살표 함수는 생성자 함수로 사용하면 에러가 난다.
제약이 있음에도 화살표 함수를 사용하는 이유는 this
때문이다.
this
화살표 함수 본문에서 this
에 접근하면 외부에서 값을 가져온다.
일반적으로 this
에 바인딩 되는 값은 아래와 같다.
this
: 전역 객체this
: 해당 메서드를 호출한 객체this
: 저장되지 않음 (=전역 객체)this
가 지정되지 않은 경우 자동으로 전역 객체 바인딩)일반 함수의 this
는 바인딩할 객체가 함수를 호출할 때 함수가 어디에 호출 되었는지에 따라 동적으로 결정된다.
하지만 화살표 함수의 this
는 정적으로 결정된다.
화살표 함수의 this는 언제나 상위 스코프의 this
를 가리킨다. 이를 렉시컬 this
(Lexical this) 라 한다.
함수를 어디서 호출하는지가 아니라 함수를 어디에 선언했는지에 따라 결정되는 것.
이렇게 되는 이유는 화살표 함수에는 this
가 아예 없기 때문이다.
const school = {
title : "명진고등학교",
students : ["지연","수아","성희"],
showList() {
this.students.forEach(
student => alert(`${this.title} : ${student} `)
);
}
};
school.showList();
여기서 this.title
은 forEach
문의 바깥에 있는 메서드인 showList
가 가리키는 대상과 동일해진다.
즉, this.title
은 school.title
과 같다.
const school = {
title : "명진고등학교",
students : ["지연","수아","성희"],
showList() {
this.students.forEach(
function(student) {
alert(`${this.title} : ${student} `)
}
);
}
};
school.showList();
위 예시에서 일반 함수를 사용했다면 this.title
은 undefined
가 출력된다.
forEach
에 전달되는 함수의 this
가 undefined
이기 때문디ㅏ.
화살표 함수는 모든 인수에 접근할 수 있게 해주는 유사배열객체 arguments를 지원하지 않는다.
~ 데코레이터 개념 학습 후 작성 예정