# ํ์ดํ ํจ์(Arrow Function)
ํ์ดํ ํจ์(Arrow Function)๋ ES6์ ์๋ก์ด ํจ์ ์ ์ ๋ฐฉ์์ ๋๋ค.
# ๊ธฐ์กด์ ํจ์ ์ ์ ๋ฐฉ์
๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์ ์ ์ ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค.
var a = function() {
// ...
};
# ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ ํจ์ ์ ์
ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ ํจ์ ์ ์ ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค.
var a = () => {
// ...
};
# ํ์ดํ ํจ์์ ๋ค์ํ ๋ฌธ๋ฒ
ํ์ดํ ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ๊ฐ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์๋ถํฐ {} ๋ฅผ ์ด์ฉํ ์ ์ธ ๋ฐฉ์๊น์ง ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
# 1. ๋จ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์
๋จ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ๊ฐ์ํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
() => 10 + 20; // {} ํ์ ์์
# 2. ํจ์ ์ ์ธ ๋ฐฉ์
๋ณต์กํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ์ธ๋ฌธ์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ์๋ {}๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
() => {
print();
log();
return 10 + 20;
};
# 3. ์ ๋ฌ ์ธ์(parameter)๊ฐ ํ๋์ธ ๊ฒฝ์ฐ
์ธ์๋ฅผ 1๊ฐ๋ง ์ ์ธํ๋ ๊ฒฝ์ฐ ์ธ์๋ฅผ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ์๊ดํธ() ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
const a = num => {
return num * 10;
};
const b = num => num * 10;
a(10); // 100
b(10); // 100
# this ๋ฐ์ธ๋ฉ์ ๋ณํ
ํ์ดํ ํจ์์์ ์ฌ์ฉ๋๋ this ๋ฐ์ธ๋ฉ์ ๊ธฐ์กด ํจ์์ this (opens new window)์ ๋ค๋ฅธ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ์ดํ ํจ์์ this๋ ํจ์๋ฅผ ์ ์ธํ ๋์ ์์ ์ค์ฝํ์ this๋ก ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ฒด๊ฐ ์ ํด์ง๋๋ค.
์๋๋ ํ์ดํ ํจ์์ this๋ฅผ ๋ํ๋ธ ์์ ์ ๋๋ค. innerFunc์ ์์ ์ค์ฝํ๋ printThis์ด๊ธฐ ๋๋ฌธ์ printThis์ ๋ด๋ถ this์ innerFunc์ ๋ด๋ถ this๋ ๊ฐ์ ๊ฐ์ผ๋ก ๋ฐ์ธ๋ฉ ๋ฉ๋๋ค.
const foo = {
name: "bar",
age: 10000,
printThis() {
console.log(this); // {name: "bar", age: 10000, printThis: ฦ}
const innerFunc = () => {
return this; // {name: "bar", age: 10000, printThis: ฦ}
};
console.log(innerFunc());
}
};
foo.printThis();
# setTimeout์์์ this
์ผ๋ฐ ํจ์์์ setTimeout์์์ this๋ window๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๊ทธ๋ฌ๋ ํ์ดํ ํจ์์์๋ ์์ ์ค์ฝํ์ this๋ก ๊ฐ์ด ๋ฐ์ธ๋ฉ ๋ฉ๋๋ค.
const foo = {
name: "bar",
age: 10000,
getThisArrowFunc: function() {
console.log(this); // {name: "bar", age: 10000, getThisArrowFunc: ฦ}
setTimeout(() => {
console.log(this); // {name: "bar", age: 10000, getThisArrowFunc: ฦ}
}, 1000);
},
getThisFunc: function() {
console.log(this); // {name: "bar", age: 10000, getThisFunc: ฦ}
setTimeout(function() {
console.log(this); // window
}, 1000);
}
};
foo.getThisArrowFunc();
foo.getThisFunc();
๊ทธ๋ฌ๋ ์๊ฒฉ๋ชจ๋('use strict') ์ผ๋๋ ๋ฐ์ธ๋ฉ ๋์ง ์์ต๋๋ค.
"use strict";
(function() {
setTimeout(() => {
console.log(this); // undefined
}, 1000);
})();
# addEventListener์์์ this
addEventListener ๋ ๋ฒ์งธ ์ธ์๋ก ํ์ดํ ํจ์๋ฅผ ๋ฃ์ผ๋ฉด this๋ ์์ ์ค์ฝํ์ this๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
const button = document.getElementById("this-button");
button.innerText = "ํจ์ ํธ์ถ ๋ฒํผ";
button.addEventListener("click", () => {
console.log(this === window); // true
console.log(this.innerText); // undefined
});
๊ทธ๋์ addEventListener ํจ์์์ this๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํ์ดํ ํจ์๊ฐ ์๋ ์ผ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ ํจ์๋ก ์ ์๋ addEventListener ํจ์์ this๋ currentTarget์ ๊ฐ๋ฆฌํต๋๋ค.
const button = document.getElementById("this-button");
button.innerText = "ํจ์ ํธ์ถ ๋ฒํผ";
button.addEventListener("click", function() {
console.log(this === button); // true
console.log(this.innerText); // ํจ์ ํธ์ถ ๋ฒํผ
});
addEventListener ์ฝ๋ฐฑ ํจ์ ์์์ ์ฌ์ฉ๋๋ this๋ class๋ก ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์๋ ์์ ์ฝ๋๋ฅผ ์ฐธ์กฐํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
class Foo {
constructor() {
this.name = "bar";
}
register() {
window.addEventListener("keydown", e => this.someMethod(e));
}
someMethod(event) {
console.log(this.name); // bar
console.log(event.keyCode); // Enter key๋ฅผ ๋๋ฅด๋ฉด 63
}
}
const baz = new Foo();
baz.register();
# call, bind, apply๋ก ๋ฐ์ธ๋ฉ ๋ณ๊ฒฝ ๋ถ๊ฐ
ํ๊ฐ์ง ์ฃผ์ํ์ค ์ ์ ์ผ๋ฐ ํจ์์ this์ ๋ค๋ฅด๊ฒ ํ์ดํ ํจ์์์์ this๋ call
, bind
, apply
๋ฉ์๋๋ก this์ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
this.foo = "bar";
const normalFunc = function() {
return this.foo;
};
const arrowFunc = () => this.foo;
console.log(normalFunc.call({ foo: "baz" })); // baz
console.log(arrowFunc.call({ foo: "baz" })); // bar
# ์์ฑ์ ํจ์๋ก ์ฌ์ฉ ๋ถ๊ฐ
ํ์ดํ ํจ์๋ ์์ฑ์ ํจ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
const Foo = () => {};
const foo = new Foo(); // Uncaught TypeError: Foo is not a constructor
โ Const & Let Enhanced Object Literal โ