자바스크립트는 ES6부터 함수를 사용목적에 따라 구별하고 있다. 일반함수, 메서드, 화살표 함수이다. 이러한 함수들은 호출방식을 달리하고 있으며, 각자 내부슬롯이 다르게 작동된다. 그 중에서도 화살표 함수는 es6 이전에는 없던 기능이다. 화살표 함수의 정의 방식을 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
|
//값을 반환하고, 문이 하나인 경우 중괄호를 생략할 수 있다.
const func = (x, y) => x*y;
//매개변수가 하나인 경우, 소괄호를 생략할 수 있다.
const func1 = x => x*2;
//객체 리터럴을 반환할 수 있지만, 소괄호를 감싸줘야 한다.
const func2 = (x,y) => ({ x, y});
func2(1, "text"); // { x: 1, y: "text" }
|
cs |
위와같은 문법 뿐만 아니라, 즉시실행함수에도 쓰인다. 실제로 토이프로젝트를 해보니 화살표함수를 즉시실행 함수의 형태로 쓰는 경우가 많았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//화살표함수를 즉시실행 함수로 사용
const func = (name => ({
sayHi() { return ( `Hi? My name is ${name}`);}
}))('Lee');
//아래의 즉시실행함수와 같은 기능을 한다.
const func = (function (name) {
return {
sayHi : function () {
return `Hi? My name is ${name}.`;
}
}
})('Lee');
|
cs |
여기서 func은 sayHi라는 프로퍼티를 갖는 객체를 반환하며 즉시실행되는 함수이다.
화살표함수와 일반함수의 차이점
앞서 말했듯이 es6에서는 함수의 종류별로 그 기능을 달리 사용하게 된다. 화살표함수는 일반함수와 달리 인스턴스를 갖지 않으므로 new를 사용하여 생성자 함수로 호출할 수 없다. 인스턴스를 생성할 수 없으므로 prototype 프로퍼티가 없고 프로토타입도 생성하지 않는다. 또한 매개변수에는 중복된 이름을 사용할 수 없다는 특징이 있다. 이와같은 특징 외에 가장 크게 구별되는 점이 this이다. 간단히 말하자면 화살표 함수의 this 는 함수 자체의 this 바인딩을 갖지 않는다.
따라서 화살표 함수 내부에서 this를 참조하면 상위 스코프에서 this를 탐색한다. 결국 화살표함수의 this는 함수가 정의된 위치에 의해 결정된다는 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
return arr.map(item => this.prefix + item);
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer. add (['tansition', 'user-select']));
|
cs |
참고로 map 메서드는 매개변수를 통해 전달된 요소값을 전달하면서 콜백함수를 arr의 요소 개수만큼 호출한다. 콜백 함수의 반환값들로 구성된 새로운 배열을 반환한다. 만약 위 코드에서 map의 매개변수인 함수를 일반함수로 작성하였다면 어떨까? 위의 코드는 오류가 발생한다. 클래스 내부의 코드에는 strict mode가 암묵적으로 적용되고 모든 함수 내부의 this에 undefined가 바인딩되기 때문이다. 즉, 콜백함수의 this(undefined)와 외부함수의 this(전역객체)가 다른 값을 가리키게 되면서 실행되지 않게 된다. (type error 발생)
화살표 함수로 메서드를 정의할때 주의점
예제에서 sayHi 프로퍼티에 할당한 화살표 함수 내부의 this는 상위 스코프 전역의 this가 가리키는 전역 객체(window.name)를 가리키게된다. 따라서 애초에 메서드를 정의할때는 화살표함수로 정의하는 것을 지양하도록 하자.
es6에서 사용하는 메서드 축약표현은 다음과 같다.
1
2
3
4
5
6
7
|
class Person {
name = 'Lee';
sayHi() { console.log(`Hi ${this.name}`); }
// sayHi : function () { console.log(...) }
}
const person = new Person();
person.sayHi(); // Hi Lee
|
cs |
'공부 > Java script' 카테고리의 다른 글
[JavaScript]배열에서 자주 쓰는 메서드들 (0) | 2021.12.12 |
---|---|
[JavaScript] 배열의 기본 원리 (0) | 2021.12.11 |
[JavaScript] this 바인딩 (0) | 2021.11.02 |
[Java Script] 래퍼객체와 전역객체 (0) | 2021.11.01 |
[JavaScript] 프로퍼티 어트리뷰트 : 프로퍼티의 세부설정 (1) | 2021.10.27 |