...

νμ΄ν ν¨μ (Arrow function)
βμλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό λ§λ€ λλ function ν€μλλ₯Ό μ¬μ©νμ¬ μ μν μ μλ€. μλ₯Όλ€μ΄ λ μμ ν©μ ꡬνλ ν¨μλ λ€μκ³Ό κ°μ΄ μμ±ν μ μλ€.
function sum(a, b) {
return a + b;
}
ES6λΆν°λ νμ΄ν ν¨μ(arrow function)λΌλ μλ‘μ΄ λ¬Έλ² λ°©μμΌλ‘ ν¨μλ₯Ό λ§λ€ μ μκ² λμλ€. νμ΄ν ν¨μλ => κΈ°νΈλ₯Ό μ¬μ©νμ¬ function ν€μλλ₯Ό μλ΅ν μ μλ€.

κ·Έλμ μμ ν¨μλ₯Ό νμ΄ν ν¨μλ‘ λ°κΎΈλ©΄ μλμ κ°μ΄ ꡬμ±ν μ μλ€.
let sum = (a, b) => {
return a + b;
}
// λ§μΌ ν¨μκ° λ¨μν 리ν΄λ¬Έλ§ μλ€λ©΄ νμ€λ‘ λ μ¬ννκ² μ€μΌ μ μλ€
const sum = (a, b) => a + b;
νμ΄ν ν¨μ λ¬Έλ² νν
μλ°μ€ν¬λ¦½νΈμ νμ΄ν ν¨μλ₯Ό ννν μ μλ μ¬λ¬κ°μ§ λ°©μμ λ€μκ³Ό κ°λ€.
맀κ°λ³μ νν
맀κ°λ³μκ° νλλΏμ΄λ©΄ 맀κ°λ³μμ κ΄νΈ λΆλΆμ μλ΅ν μ μλ€.
// 맀κ°λ³μκ° μμ κ²½μ°
() => { ... }
// 맀κ°λ³μκ° ν κ°μΈ κ²½μ°, μκ΄νΈλ₯Ό μλ΅ν μ μλ€.
x => { ... }
// 맀κ°λ³μκ° μ¬λ¬ κ°μΈ κ²½μ°, μκ΄νΈλ₯Ό μλ΅ν μ μλ€.
(x, y) => { ... }
ν¨μ λͺΈμ²΄ νν
ν¨μ λͺΈμ²΄ λ΄μ μ½λκ° νμ€μ΄κ³ λ¨μν returnλ¬Έ λ°μ μλ€λ©΄ μ€κ΄νΈμ return ν€μλλ₯Ό μλ΅ν μ μλ€.
// single line block
x => { return x * x }
// ν¨μ λͺΈμ²΄κ° νμ€μ ꡬ문μ΄λΌλ©΄ μ€κ΄νΈλ₯Ό μλ΅ν μ μμΌλ©° μ묡μ μΌλ‘ returnλλ€. μ ννκ³Ό λμΌνλ€.
x => x * x
κ°μ²΄ 리ν°λ΄ λ°ν
κ°μ²΄ 리ν°λ΄μ λ°ννλ €λ©΄ μκ΄νΈλ‘ κ°μΈμΌ νλ€. μλνλ©΄ λΈλ μ€κ΄νΈ { } μ°λ©΄ μκ° ν¨μ λΈλ‘μΈμ§ κ°μ²΄ λΈλ‘μΈμ§ νλ¨ν μ μκΈ° λλ¬Έμ΄λ€.
() => { return { a: 1 }; }
() => ({ a: 1 }) // μ ννκ³Ό λμΌνλ€. κ°μ²΄ λ°νμ μκ΄νΈλ₯Ό μ¬μ©νλ€.
κ³ κΈ μ‘°ν© νν
// 맀κ°λ³μ κΈ°λ³Έκ°
(a = 1, b = 2) => a + b;
// λλ¨Έμ§ λ§€κ°λ³μ
(...args) => args;
// ꡬ쑰 λΆν΄ ν λΉ
([a, b] = [1, 2]) => a + b;
let age = prompt("λμ΄λ₯Ό μλ €μ£ΌμΈμ.", 18);
let welcome = (age < 18) ?
() => alert('μλ
') :
() => alert("μλ
νμΈμ!");
welcome();
νμ΄ν ν¨μμ νΉμ§
μλ°μ€ν¬λ¦½νΈμ νμ΄ν ν¨μλ function ν¨μλ₯Ό μΆμ½νμ¬ νννλ λ¬Έλ²μ΄μ§λ§, μΌλ°μ μΈ ν¨μμ λ€λ₯Έ λͺ κ°μ§ κ³ μ ν νΉμ§μ κ°μ§λ€. μ΄λ¬ν νΉμ§μ νμ΄ν ν¨μλ₯Ό μ μ©νκ² λ§λ€κΈ°λ νμ§λ§, ν¨μ μ΄ λκΈ°λ νκΈ° λλ¬Έμ μ μκΉκ² μ΄ν΄λ³΄μμΌ νλ€.
νμ΄ν ν¨μμ thisκ° μλ€
μ°μ νμ΄ν ν¨μμλ thisκ° μ‘΄μ¬νμ§ μλλ€. κ·Έλμ νμ΄ν ν¨μμμ this ν€μλλ‘ μ κ·Όνλ©΄, μμ μ΄ μλ μΈλΆμμ κ°μ κ°μ Έμ€κ² λλ€.
μλ₯Όλ€μ΄ λ€μ user λΌλ κ°μ²΄μ sayHiμ νλ‘νΌν°κ° μ΄λ ν ννμ ν¨μλ‘ μ΄λ£¨μ΄μ Έ μλλμ λ°λΌ this.name μ΄ κ°λ¦¬ν€λ κ°μ΄ λ¬λΌμ§κ² λλ€. νμ΄ν ν¨μλ μμ λ§μ thisλ₯Ό κ°μ§μ§ μκΈ° λλ¬Έμ, μμ μ κ°μΈλ μΈλΆ νκ²½μ thisλ₯Ό κ·Έλλ‘ λ°λ₯΄κΈ° λλ¬Έμ΄λ€. μ¦, νμ΄ν ν¨μμμ thisλ μ μ μΌλ‘ κ²°μ λλ€.
var name = "Global";
let user = {
name: "Inpa",
sayHi: function() { // μΌλ° ν¨μ
console.log(this.name);
}
};
user.sayHi(); // Inpa
var name = "Global";
let user = {
name: "Inpa",
sayHi: () => { // νμ΄ν ν¨μ
console.log(this.name);
}
};
user.sayHi(); // Global
λ°λΌμ μ΄λ¬ν νΉμ§ λλ¬Έμ νμ΄ν ν¨μ λ΄μμ this ν€μλλ₯Ό μ¬μ©ν λ κ΅μ₯ν¬ μ£Όμ κΉκ² λ°μ ΈμΌ νλ€. μ¬λμ΄ μκ°νλ thisμ μμ§μ΄ ν λΉνλ this κ°μ΄ μμ ν λ€λ₯΄κΈ° λλ¬Έμ΄λ€.
κ·Έλ°λ° μ΄λ¬ν νμ΄ν ν¨μμ this νΉμ§ λλ¬Έμ μλ°μ€ν¬λ¦½νΈμ μ½λ°± ν¨μμμ μ μ©ν μ°μΌ μλ μλ€. μλ₯Όλ€μ΄ group μ΄λΌλ κ°μ²΄μ class μ students νλ‘νΌν°λ₯Ό μ μνκ³ μ΄ μ 보λ₯Ό forEach() λ°λ³΅λ¬ΈμΌλ‘ μΆλ ₯νλ showList() λ©μλκ° μλ€κ³ ν΄λ³΄μ.
/* μΌλ° ν¨μλ‘ μΈ κ²½μ° */
let group;
group = {
class: "1λ°",
students: ["짱ꡬ", "μ² μ", "νμ΄"],
showList() {
group.students.forEach(
function(student) {
// this ==== window
console.log(this.class + ': ' + student)
}
);
}
};
group.showList();

λ§μΌ μΌλ° ν¨μλ‘μ forEach() μ μ½λ°± ν¨μμ λ£κ² λλ€λ©΄, μ΄ μ½λ°± ν¨μ λ΄μ thisλ groupμ΄ μλ window κ°μ²΄λ₯Ό κ°λ¦¬μΌ κ²°κ³Όμ μΌλ‘ this.class μ μΆλ ₯κ°μ undefined μ΄ λκ² λλ€. (μ μνμ§ μμμΌλκΉ)
λ°λ©΄, νμ΄ν ν¨μλ₯Ό μ¬μ©νκ² λλ©΄, forEach() μ μ½λ°± ν¨μ λ΄ this λ μ νν group κ°μ²΄λ₯Ό κ°λ¦¬ν€κ² λλ€. μλνλ©΄ μ½λ°± ν¨μλ λ³λμ μμ λ§μ this λ₯Ό κ°μ§κ² λμ΄ window κ°μ²΄λ₯Ό κ°λ¦¬ν€κ² λμ§λ§, νμ΄ν ν¨μλ μμ λ§μ κ³ μ μ thisκ° μκΈ° λλ¬Έμ μΈλΆ(group)μ thisλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ΄λ€.
/* νμ΄ν ν¨μλ‘ μΈ κ²½μ° */
// νμ΄ν ν¨μμ thisλ μμμ thisλ₯Ό κ·Έλλ‘ κ°μ Έμ¨λ€.
let group;
group = {
class: "1λ°",
students: ["짱ꡬ", "μ² μ", "νμ΄"],
showList() {
group.students.forEach(
(student) => {
// this ==== group
console.log(this.class + ': ' + student)
}
);
}
};
group.showList();

μ¦, νμ΄ν ν¨μ λ΄μ this.titleμ group.titleκ³Ό κ°κ² λλ€.
β
νμ΄ν ν¨μμ arguments κ° μλ€
μλ°μ€ν¬λ¦½νΈ ν¨μμ argumentsλ μΌλ°μ μΈ ν¨μκ° νΈμΆλ λ μ λ¬λ μΈμλ€μ λ΄κ³ μλ μ μ¬ λ°°μ΄ κ°μ²΄λ€.
function argsFunc() {
console.log(arguments);
}
argsFunc(1, 2, 3); // [1, 2, 3]
νμ΄ν ν¨μλ μΌλ° ν¨μμλ λ€λ₯΄κ² λͺ¨λ μΈμμ μ κ·Όν μ μκ² ν΄μ£Όλ μ μ¬ λ°°μ΄ κ°μ²΄ argumentsλ₯Ό μ§μνμ§ μλλ€. λ°λΌμ μ€ννλ©΄ λ€μκ³Ό κ°μ΄ μλ¬κ° λ°μνκ² λλ€.
let argsFunc = () => {
console.log(arguments);
}
argsFunc(1, 2, 3); // ! Error

λμ μ λλ¨Έμ§ λ§€κ°λ³μ(rest parameter)λΌλ λ¬Έλ²μ μ¬μ©νμ¬ μΈμλ€μ λ°°μ΄λ‘ λ°μ μ μλ€.
let argsFunc = (...args) => { // ...λλ¨Έμ§ λ§€κ°λ³μ
console.log(args);
}
argsFunc(1, 2, 3); // [1, 2, 3]
νμ΄ν ν¨μλ μμ±μ ν¨μκ° μλ€
μμ±μ ν¨μλ new μ°μ°μμ ν¨κ» νΈμΆλμ΄ κ°μ²΄λ₯Ό μμ±νλ ν¨μλ₯Ό λ§νλ€.
function User(name) {
this.name = name;
}
let user = new User("Alice");
console.log(user.name); // Alice
μμ νμ΄ν ν¨μλ thisκ° μκΈ° λλ¬Έμ newμ ν¨κ» μ€νν μ μλ€. λ°λΌμ νμ΄ν ν¨μλ newμ ν¨κ» νΈμΆν μ μλ€.
let User = (name) => {
this.name = name;
}
let user = new User("Alice"); // TypeError: User is not a constructor
λ°λΌμ νμ΄ν ν¨μλ κ°μ²΄λ₯Ό μμ±νλ μ©λλ‘ μ¬μ©ν μ μλ€. κ·Έλμ νμ΄ν ν¨μλ λ³΄ν΅ μ½λ°± ν¨μλ μ΅λͺ ν¨μλ‘μ μ¬μ©λλ νΈμ΄λ€.
μΆκ°λ‘ νμ΄ν ν¨μλ ν΄λμ€ κ΄λ ¨ ν€μλμΈsuperλ μλ€.
νμ΄ν ν¨μλ₯Ό λ¨μ©ν΄μλ μλλ κ²½μ°
βμμμ μ΄ν΄λ³Έ λ°μ κ°μ΄ νμ΄ν ν¨μλ μΌλ° ν¨μμλ λ¬λ¦¬ μμ λ§μ thisλ₯Ό κ°μ§μ§ μλλ€. κ·Έλμ νμ΄ν ν¨μλ₯Ό μλ°μ€ν¬λ¦½νΈμμ μ¬μ©ν¨μ μμ΄ λͺκ°μ§ μ μ½μ΄ μκΈ΄λ€.
- μΌλ° κ°μ²΄μ λ©μλ μ¬μ© X (thisκ° μμΌλκΉ)
- prototype λ©μλλ‘ μ¬μ© X (λ§μ°¬κ°μ§ νλ‘ν νμ κ°μ²΄ thisμ°Έμ‘° λΆκ°λ₯)
- μμ±μ ν¨μλ‘ μ¬μ© X (νμ΄ν ν¨μλ prototype νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ§ μλ€)
- addEventListener ν¨μμ μ½λ°±ν¨μλ μ‘°μ¬ν΄μ
- νμ΄ν ν¨μλ call, apply, bind λ©μλλ₯Ό μ¬μ©νμ¬ thisλ₯Ό λ³κ²½ν μ μλ€
μΌλ° κ°μ²΄μ λ©μλ μ¬μ© X
λ§μΌ this μ°Έμ‘°λ₯Ό μμ£Ό μ¬μ©ν΄μΌν λ©μλ λ‘μ§μ΄λΌλ©΄, μΌλ° κ°μ²΄μ λ©μλλ‘μ νμ΄ν ν¨μ μ¬μ©μ νΌν΄μΌ νλ€. μλνλ©΄ thisκ° μμΌλκΉ λ©μλλ₯Ό νΈμΆν κ°μ²΄λ₯Ό κ°λ¦¬ν€μ§ μκ³ μμ 컨νμ€νΈμΈ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν€κ² λλ¬Έμ΄λ€.
const person = {
name: 'Lee',
sayHi: () => console.log(`Hi ${this.name}`)
};
person.sayHi(); // Hi undefined
prototype λ©μλλ‘ μ¬μ© X
νμ΄ν ν¨μλ‘ μ μλ λ©μλλ₯Ό prototype κ°μ²΄λ‘μ ν λΉνλ κ²½μ°λ μμ κ°μ΄ λμΌν λ¬Έμ κ° λ°μνλ€. λ°λΌμ prototypeμ λ©μλλ₯Ό ν λΉνλ κ²½μ° μΌλ° ν¨μλ₯Ό ν λΉνλλ‘ νλ€.
// λͺ¨λ κ°μ²΄λ κΈ°λ³Έμ μΌλ‘ Objectκ°μ²΄μ νλ‘ν νμ
체μ΄λ λμ΄μλ€.
const person = {
name: 'Lee',
};
Object.prototype.sayHi = () => console.log(`Hi ${this.name}`);
person.sayHi(); // Hi undefined
μμ±μ ν¨μλ‘ μ¬μ© X
μμ±μ ν¨μλ prototype νλ‘νΌν°λ₯Ό κ°μ§λ©° prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ νλ‘ν νμ κ°μ²΄μ constructorλ₯Ό μ¬μ©νλ€. νμ§λ§ νμ΄ν ν¨μλ prototype νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ§ μκΈ° λλ¬Έμ, λ°λΌμ μμ κ°μ μ΄μ λ‘ μ¬μ©νλ©΄ μλλ€.
const Foo = (name) => {
this.name = name
};
// νμ΄ν ν¨μλ prototype νλ‘νΌν°κ° μλ€
console.log(Foo.hasOwnProperty('prototype')); // false
const foo = new Foo("FFF"); // TypeError: Foo is not a constructor


Object.getOwnPropertyNames()λ©μλλ κ°μ²΄μ λͺ¨λ μμ± μ΄λ¦μ ν¬ν¨νλ λ°°μ΄μ λ°ννλ€.
addEventListenerμ μ½λ°± ν¨μλ μ‘°μ¬ν΄μ
νμ΄ν ν¨μλ₯Ό addEventListener ν¨μμ μ½λ°± ν¨μλ‘ μ¬μ©ν λλ μ£Όμν΄μΌ νλ€. addEventListener ν¨μλ μ΄λ²€νΈκ° λ°μν λλ§λ€ μ½λ°± ν¨μλ₯Ό νΈμΆνλλ°, μ΄λ μ½λ°± ν¨μμ thisλ μ΄λ²€νΈκ° λ°μν μμλ₯Ό κ°λ¦¬ν€κ² λλ€.
<button>Click me!</button>
<script>
let button = document.querySelector('button');
button.addEventListener('click', function() {
console.log(this); // <button> μμ
});
</script>
νμ§λ§ νμ΄ν ν¨μλ₯Ό μ½λ°± ν¨μλ‘ μ¬μ©νλ©΄, thisλ μΈλΆ λ μ컬 νκ²½μ thisλ₯Ό κ°λ¦¬ν€λ―λ‘, μνλ κ²°κ³Όκ° λμ€μ§ μμ μ μλ€.
<button>Click me!</button>
<script>
let button = document.querySelector('button');
button.addEventListener('click', () => {
console.log(this); // window κ°μ²΄
});
</script>
λ°λΌμ addEventListener ν¨μ λ΄μμ this ν€μλλ₯Ό μ¬μ©νλ κ²½μ°μλ νμ΄ν ν¨μ λμ μΌλ°μ μΈ ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ μ¬λ°λ₯Έλ°, νμ§λ§ νμ
μμλ forEach μ λλΆμ΄ addEventListener ν¨μμ μ½λ°± ν¨μλ₯Ό μ½λ ννμ κ°λ΅νλ₯Ό μν΄ νμ΄ν ν¨μλ₯Ό μ°λ μ¬λ‘κ° λ§λ€. λ°λΌμ μ΄λ° κ²½μ°μλ this ν€μλλ₯Ό μ¬μ©νμ§ μκ³ , addEventListener ν¨μμ 맀κ°λ³μμΈ event κ°μ²΄μ currentTarget νΉμ target νλ‘νΌν°λ₯Ό μ¬μ©νμ¬ μ΄λ²€νΈκ° λ°μν μμμ μ κ·Όνλ νΈμ΄λ€.
<button>Click me!</button>
<script>
let button = document.querySelector('button');
button.addEventListener('click', (event) => {
console.log(event.target); // <button> μμ
});
</script>
call, apply, bind λ‘ thisλ₯Ό λ³κ²½ν μ μλ€
λ³΄ν΅ μλ°μ€ν¬λ¦½νΈμμ this ν€μλλ₯Ό μ‘°μνλ λνμ μΈ λ°©λ²μΌλ‘ call, apply, bind ν¨μλ₯Ό μ΄μ©ν κΈ°λ²μ΄ μλλ°, μ΄λ νμ΄ν ν¨μμλ ν΅νμ§ μλλ€. κ°λ¨ν μκ°νλ©΄ λλ€. νμ΄ν ν¨μλ this μμ²΄κ° μκΈ° λλ¬Έμ΄λ€.
const obj1 = { message: 'Hello from obj1' };
const obj2 = { message: 'Hello from obj2' };
// μΌλ° ν¨μ
function normalFunction() {
console.log(this.message);
}
// νμ΄ν ν¨μ
const arrowFunction = () => {
console.log(this.message);
};
// μΌλ° ν¨μμμ this λ³κ²½
normalFunction.call(obj1); // 'Hello from obj1'
normalFunction.call(obj2); // 'Hello from obj2'
// νμ΄ν ν¨μμμ this λ³κ²½ (λ³κ²½μ΄ λμ§ μμ)
arrowFunction.call(obj1); // undefined
arrowFunction.call(obj2); // undefined
μ΄μ²λΌ νμ΄ν ν¨μλ ES6μμ λμ λ μλ‘μ΄ λ°©μμΌλ‘, κ°λ¨νκ³ κ°κ²°ν λ¬Έλ²μΌλ‘ μ μ°ν¨κ³Ό ννλ ₯μ λμ¬μ£Όλ ν¨μλ₯Ό λ§λ€ μ μμ§λ§, λͺ¨λ μν©μ νμ΄ν ν¨μλ₯Ό μ¬μ©ν μ μλ κ²μ μλλ―λ‘, μ£Όμν΄μΌ ν μ λ μλ€. λ°λΌμ νμ΄ν ν¨μμ νΉμ§κ³Ό νκ³λ₯Ό μ μ΄ν΄νκ³ , μ μ ν μν©μ λ§κ² νμ΄ν ν¨μμ μΌλ°μ μΈ ν¨μλ₯Ό μ μ νκ² μ ννκ³ νμ©νλ κ²μ΄ μ€μνλ€.
# μ°Έκ³ μλ£
https://ko.javascript.info/arrow-functions-basics
https://poiemaweb.com/js-event
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.