Chapter 02: ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (Arrow Function)

๐Ÿ’ก ๋„์„œ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ต์‹ฌ ๊ฐ€์ด๋“œ๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

# 2.1 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜


// ์ผ๋ฐ˜ ํ•จ์ˆ˜
const greeting = function(name) {
    return "hello " + name;
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
const greeting = (name) => {
    return `hello ${name}`;
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ผ ๊ฒฝ์šฐ, ๊ด„ํ˜ธ ์ƒ๋žต)
const greeting = name => {
    return `hello ${name}`;
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, ๊ด„ํ˜ธ ํ•„์ˆ˜)
const greeting = () => {
    return `hello`;
}

์ฐธ๊ณ  : ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด

Template Literals

๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ string + ๋ณ€์ˆ˜์˜ ํ˜•ํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

const sayHello = (name = ‘Newstar’) => `Hello ${name}!`

# 2.2 ์•”์‹œ์  ๋ฐ˜ํ™˜


Arrow Function์€ {} ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ™”์‚ดํ‘œ ๋’ค์— ๋‚˜์˜ค๋Š” ๋‚ด์šฉ์— ๊ธฐ๋ณธ์ ์œผ๋กœ return ์„ ํ•จ์ถ•.

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐ˜ํ™˜ ์‹œ ๊ฐ์ฒด๋ฅผ () ๋กœ ๊ฐ์‹ธ์ฃผ์–ด ๋ฐ˜ํ™˜ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ๊ฐ์ฒด์ž„์„ ํ‘œํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

// string ๋ฐ˜ํ™˜
const greeting = (name) => `hello ${name}`;

// object literal ๋ฐ˜ํ™˜
const race = "100m dash";
const runners = ["Usain Bolt", "Justin Gatlin", "Asafa Powell"];

const results = runners.map((runner, i) => ({name: runner, race, place: i + 1}));
console.log(results);

์ฐธ๊ณ  : map

Array.map()

Calls a defined callback function on each element of an array, and returns an array that contains the results.
๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ •์˜๋œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•œ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•œ๋‹ค.

// Q7. make an array containing only the students' scores
// result should be: [45, 80, 90, 66, 88]
{
    const result = students.map((student) => student.score);
  console.log(result);
}

์œ„ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ธ์ž๋ฅผ student ๋Œ€์‹  value , item ๋“ฑ์œผ๋กœ ๋Œ€์‹ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง๊ด€์ ์ด์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ๊ทธ ์˜๋ฏธ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋„ค์ด๋ฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

# 2.3 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ต๋ช… ํ•จ์ˆ˜


ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ์ด๋ฆ„์ด ์—†๋Š” ์ต๋ช… ํ•จ์ˆ˜์ด๋ฉฐ, ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉ

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

greeting("Newstar");

# 2.4 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ this ํ‚ค์›Œ๋“œ


ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this ๋ฅผ ์ƒ์† ๋ฐ›๋Š”๋‹ค. ์ด๋ฅผ Lexical this๋ผ ํ•œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

const box = document.querySelector(".box");
// click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก
box.addEventListener("click", function() {
    // div์— opening ํด๋ž˜์Šค ํ† ๊ธ€
    this.classList.toggle("opening"); // this == box
    setTimeout(() => { // ์—ฌ๊ธฐ์„œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด์ธ window๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
        // ํด๋ž˜์Šค ๋‹ค์‹œ ํ† ๊ธ€
        this.classList.toggle("opening"); // this == box
    }, 500);
})

์ฐธ๊ณ  : addEventListener ํ•จ์ˆ˜ ๋‚ด์˜ this

addEventListener ํ•จ์ˆ˜ ๋‚ด์˜ this

๐Ÿ“Ž ์ฐธ๊ณ  ๋งํฌ

  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜๋œ addEventListener ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด Window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
// Bad  
var button = document.getElementById('myButton');

button.addEventListener('click', () => {
    console.log(this === window); // => true
    this.innerHTML = 'Clicked button';
});
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์ •์˜๋œ addEventListener ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ๋ฐ”์ธ๋”ฉ๋œ ์š”์†Œ(currentTarget)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
// Good
var button = document.getElementById('myButton');

button.addEventListener('click', function() {
  console.log(this === button); // => true
  this.innerHTML = 'Clicked button';
});

์ฐธ๊ณ  : ์ „์—ญ๊ฐ์ฒด(Global Object)

์ „์—ญ๊ฐ์ฒด(Global Object)

์ „์—ญ๊ฐ์ฒด(Global Object)๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์œ ์ผํ•œ ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ Browser-side์—์„œ๋Š” window, Server-side(Node.js)์—์„œ๋Š” global ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

// in browser console
this === window // true

// in Terminal node
this === global // true

# 2.5 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ


๋ฌธ์ œ ์ƒํ™ฉ 1.

const button = document.querySelector('btn');
button.addEventListener('click', () => {
    // ์˜ค๋ฅ˜ : ์—ฌ๊ธฐ์„œ this๋Š” Window ๊ฐ์ฒด
    this.classList.toggle('on');
})

๋ฌธ์ œ ์ƒํ™ฉ 2.

const person1 = {
    age: 10,
    grow: function() {
        this.age++;
        console.log(this.age);
    }
}

person1.grow(); // 11

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

person2.grow(); // NaN

๋ฌธ์ œ ์ƒํ™ฉ 3.

// ๋ฌธ์ œ ์ƒํ™ฉ
const showWinner = () => {
    const winner = arguments[0];
    console.log(`${winner} was the winner`);
}

showWinner("Usain", "Justin", "Asafa"); // arguments is not defined

// ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1 : ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ
const showWinner = function() {
    const winner = arguments[0];
    console.log(`${winner} was the winner`);
}

showWinner("Usain", "Justin", "Asafa"); // Usain was the winner

// ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2 : ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ• ์‚ฌ์šฉ
const showWinner = (...args) => {
    const winner = args[0];
    console.log(`${winner} was the winner`);
}

showWinner("Usain", "Justin", "Asafa"); // Usain was the winner

์ฐธ๊ณ  : spread

spread

spread ๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜๋ฏธ๋Š” ํŽผ์น˜๋‹ค, ํผ๋œจ๋ฆฌ๋‹ค ์ด๋‹ค. ์ด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด ํ˜น์€ ๋ฐฐ์—ด์„ ํŽผ์น  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ์กด์˜ ๊ฐ์ฒด๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const slime = {
  name: '์Šฌ๋ผ์ž„'
};

const cuteSlime = {
  ...slime,
  attribute: 'cute'
};

const purpleCuteSlime = {
  ...cuteSlime,
  color: 'purple'
};

console.log(slime); // { name: "์Šฌ๋ผ์ž„" }
console.log(cuteSlime); // { attribute: "cute", name: "์Šฌ๋ผ์ž„" }
console.log(purpleCuteSlime); // { attribute: "cute", name: "์Šฌ๋ผ์ž„", color: "purple" }

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฐ์—ด์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

const animals = ['๊ฐœ', '๊ณ ์–‘์ด', '์ฐธ์ƒˆ'];
const anotherAnimals = [...animals, '๋น„๋‘˜๊ธฐ'];

console.log(animals); // ['๊ฐœ', '๊ณ ์–‘์ด', '์ฐธ์ƒˆ']
console.log(anotherAnimals); // ['๊ฐœ', '๊ณ ์–‘์ด', '์ฐธ์ƒˆ', "๋น„๋‘˜๊ธฐ"]

๋ฐฐ์—ด์—์„œ spread ์—ฐ์‚ฐ์ž๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

const numbers = [1, 2, 3, 4, 5];

const spreadNumbers = [...numbers, 1000, ...numbers];
console.log(spreadNumbers); // [1, 2, 3, 4, 5, 1000, 1, 2, 3, 4, 5]

2.6 QUIZ


Q 2.1. ๋‹ค์Œ ์ค‘ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ํ™œ์šฉํ•œ ์˜ˆ๋Š”?

let arr = [1, 2, 3];

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

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

// b)
let func = arr.map(n ~> n + 1);
  • ๋‹ต : A. b

Q 2.2. ๋‹ค์Œ ์ฝ”๋“œ์˜ ์˜ฌ๋ฐ”๋ฅธ ์ถœ๋ ฅ์€?

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

console.log(person.age);
  • ๋‹ต : A. 10
    • ์œ„ ์ฝ”๋“œ์—์„œ this ๋Š” ์ „์—ญ๊ฐ์ฒด Window๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ person.age ์˜ ๊ฐ’์€ ๋ณ€ํ•จ ์—†์ด 10์ด๋‹ค.

Q 2.3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜์ž.

function(arg) {
    console.log(arg);
}
  • ๋‹ต
  • const arrFunc = arg => { console.log(arg) }