본문 바로가기

자료 따라쓰기/모던 자바스크립트 핵심 가이드

02 화살표 함수

참조하며 메모한 자료 (내돈내산) : 모던 자바스크립트 핵심 가이드 - 알베르토 몬탈레시

 

2.1 화살표 함수

뚱뚱한 화살표 ( ) => { }

는 ES6에서 처음 도입되었다

 

// ES5에서 함수 선언하는 방법
const greeting = function(name) {
	return "hello" + name;
};
// ES6에서 도입된 화살표 함수
var greeting = (name) => {
	return `hello ${name}`;
};

 

매개변수가 하나만 있으면 괄호를 생략할 수 있다

var greeting = name => {
	return `hello ${name}`;
};

 

매개변수가 전혀 없으면 빈 괄호를 써야 한다

var greeting = () => {
	return "hello";
};

 

 

 

2.2 암시적 반환

명시적 반환 생략한다, 말 안해도 반환됐다는 뜻

const greeting = name => `hello ${name}`;

 

ES5의 함수와 비교하면 어떨까

const oldFunction = function(name) {
	return "hello" + name;
};

const arrowFundtion = name => `hello ${name}`
// 리터럴 표기법은 ES5에도 쓸 수 있다

ES6에 비하면 코드줄이 긴 것을 보아 확실히 최신 것이 더 간결하고 가독성이 좋다

 

만약 모든 팀원이 ES6 문법 숙지 못했다면 이렇게 작성하는 것이 좋다

const arrowFunction = (name) => {
	return `hello ${name}`
};

 

 

객체 리터럴 암시적 반환

 

이 예시에서는 map 함수 사용하여 runners 배열에 대한 반복(순회) (iteration) 구현한다.

첫 번째 인수 runner는 배열의 현재 원소이며, i는 배열의 인덱스이다.

배열의 각 원소에 대해 name, race, place 속성을 포함하는 객체를 results에 추가한다

 

중괄호 안에 있는 것이 암시적으로 반환하는 객체 리터럴임을 자바스크립트에 알리려면,

전체를 괄호 안에 감싸야 한다

 

race를 쓰나 race: race를 쓰나 모두 결과 같다

 

 

 

2.3 화살표 함수는 익명 함수

const greeting = name => `hello ${name}`;

greeting("Ben");

 

 

 

 

2.4 화살표 함수와 this 키워드

 

화살표 함수 내부에서 this 키워드를 사용할 때 일반 함수와 다르게 동작하므로 주의 필요!

화살표 함수 사용할 때 this 키워드는 상위 스코프에 상속된다.

 

 

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>arrow function this</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="box open">
        This is a box
    </div>
    <script src="main.js"></script>
</body>
</html>

 

 

CSS

.opening {
    background-color: red;
}

 

 

 

JS

// box 클래스를 가진 div를 가져온다
const box = document.querySelector(".box");

// click 이벤트 핸들러를 등록
box.addEventListener("click", function() {

	// div에 oppening 클래스를 토글
	this.classList.toggle("opening");
    setTimeout(function() {
    
    	// 클래스를 다시 토글
    	this.classList.toggle("opening");
    }, 500);
});

 

 

 

박스 클릭했을 때 에러글이 뜬다

 

 

첫 번째 this가 const box에 할당되었지만 setTimeout 내부의 두 번째 this는 Window 객체로 설정되어

오류가 뜬 것이다

 

 

// box 클래스를 가진 div를 가져온다
const box = document.querySelector(".box");
// click 이벤트 핸들러를 등록
box.addEventListener("click", function() {
    // div에 opening 클래스를 토글
    this.classList.toggle("opening");
    setTimeout(() => {
        // 클래스를 다시 토글
        this.classList.toggle("opening");
    }, 500);
});

 

 

화살표 함수가 부모 스코프에서 this의 값을 상속한다는 것을 인지하며 쓴다.

 

여기서 두 번째 this는 부모로부터 상속되며 const box로 설정된다.

 

2.5 화살표 함수를 피해야 하는 경우

 

 

 

 

 

 

 

 

화살표 함수와 일반 함수의 차이점

arguments 객체에 대한 접근 방식에 있다

 

 

 

 

arguments 객체 - JavaScript | MDN

arguments 객체는 함수에 전달된 인수에 해당하는 Array 형태의 객체입니다.

developer.mozilla.org

 

 

 

나머지 매개변수 - JavaScript | MDN

나머지 매개변수 구문을 사용하면 함수가 정해지지 않은 수의 매개변수를 배열로 받을 수 있습니다. JavaScript에서 가변항 함수를 표현할 때 사용합니다.

developer.mozilla.org

 

arguments 객체는

함수 내부에서 접근할 수 있는 배열 객체이며, 해당 함수에 전달된 인수의 값을 담고 있다.

 

 

 

배열 표기법 arguments[0] 쓰면

첫 번째 인수에 접근할 수 있다.

 

 

this 키워드와 비슷하게, 화살표 함수에서 arguments 객체는 부모 스코프의 값을 상속한다.

 

 

 

 

함수에 전달된 모든 인수에 접근하려면, 기존 함수 표기법이나 스프레드 문법을 사용한다.

 

 

화살표 함수로 arguments에 접근하는 예시
일반 함수로 arguments에 접근하는 예시

 

 

 

[퀴즈]

 

1) 다음 중 화살표 함수를 문법에 맞게 활용한 예는?

let arr = [1, 2, 3];

//a)
let func = arr.map(n -> n + 1);

//b)
let func = arr.map(n => n + 1);

//c)
let func = arr.map(n ~> n + 1);

 

 

2) 다음 코드의 올바른 출력은?

const person = {
	age: 10,
	grow: () => {
    	this.age++;
    },
};
person.grow();

console.log(person.age);

 

 

3) 화살표 함수 문법을 사용해서 리팩터링 하자

function(arg) {
	console.log(arg);
}

 

 

 

[정답]

더보기

1)

=>

 

2)

10

화살표 함수 내에서 this 키워드는 상위 스코프(브라우저의 경우 window)에서 상속되므로

age는 10으로 유지 됨

 

3)

(arg) => {
	console.log(arg);
}

'자료 따라쓰기 > 모던 자바스크립트 핵심 가이드' 카테고리의 다른 글

23 타입스크립트 기초  (0) 2023.07.13
01 var, let, const  (3) 2023.03.29
00 자바스크립트 기초  (3) 2023.03.21