์ฃผ๋์ด ๊ฐ๋ฐ์์ ๊ฐ์ธ ๊ณต๋ถ ๊ณผ์ ์ ๊ธฐ๋กํฉ๋๋ค.
์ฝ๋ฐฑ ํจ์๋?
์ฝ๋ฐฑ ํจ์(callback function)๋, ๋ค๋ฅธ ์ฝ๋์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ํจ์
์ฝ๋ฐฑ ํจ์๋ฅผ ๋๊ฒจ๋ฐ์ ์ฝ๋๋ ์ด ์ฝ๋ฐฑ ํจ์์๊ฒ ์ ์ด๊ถ์ ๋๊ฒจ ์ฃผ๋ฉฐ, ์ฝ๋ฐฑ ํจ์๋ ํ์์ ๋ฐ๋ผ ์ ์ ํ ์์ ์ ์คํํ๋ค.
:: โจ์ ์ด๊ถ
์์ )
let count = 0;
const cbFunc = () => {
console.log(count);
if (++count > 4) clearInterval(time);
};
const timer = setInterval(cbFunc, 300);
// ์คํ ๊ฒฐ๊ณผ
// 0 (0.3์ด)
// 1 (0.6์ด)
// 2 (0.9์ด)
// 3 (1.2์ด)
// 4 (1.5์ด)
์์ ๋ฅผ ํตํด ์ฝ๋ ์คํ ๋ฐฉ์๊ณผ ์ ์ด๊ถ์ ์ดํด๋ณด๋ฉด,
code | ํธ์ถ ์ฃผ์ฒด | ์ ์ด๊ถ |
---|---|---|
cbFunc(); | ์ฌ์ฉ์ | ์ฌ์ฉ์ |
setInterval(cbFunc, 300); | setInterval | setInterval |
- setInterval์ด๋ผ๊ณ ํ๋ โ๋ค๋ฅธ ์ฝ๋โ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก์ cbFunc ํจ์๋ฅผ ๋๊ฒจ์ฃผ์
- ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ setInterval์ด ์ค์ค๋ก์ ํ๋จ์ ๋ฐ๋ผ ์ ์ ํ ์์ ์(0.3์ด ๋ง๋ค) ์ด ํจ์๋ฅผ ์คํํ๋ค.
- ์ฝ๋ฐฑ ํจ์์ ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ์ฝ๋๋ ์ฝ๋ฐฑ ํจ์ ํธ์ถ ์์ ์ ๋ํ ์ ์ด๊ถ์ ๊ฐ์ง๋ค.
- ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ์ฝ๋๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์์ ์ด๋ค ๊ฐ๋ค์ ์ด๋ค ์์๋ก ๋๊ธธ ๊ฒ์ธ์ง์ ๋ํ ์ ์ด๊ถ๋ ๊ฐ์ง๋ค.
:: โ๏ธ์ฝ๋ฐฑ ํจ์๋ ํจ์๋ค
const obj = {
vals: [1, 2, 3],
logValues: (v, i) => {
console.log(v, i)
};
};
obj.logValues(1, 2); // (1)
// {vals:[1, 2, 3], logValues: f} 1 2
[4, 5, 6].forEach(obj.logValues); // (2)
// Window {...} 4 0
// Window {...} 5 1
// Window {...} 6 2
(1) ์ด๋ฆ ์์ ์ (.)์ด ์์ผ๋ ๋ฉ์๋๋ก์ ํธ์ถ
โ โ ์ด ๋์ this
๋ obj
(2) ํจ์๋ง ์ ๋ฌ ๋ฐ์ ๊ฒ์ผ๋ก, obj
์ ์ฐ๊ด์ด ์์ด์ง๋ค.
โ โ ์ด ๋์ this
๋ ์ ์ญ ๊ฐ์ฒด(window)
โ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this
์ ๋ค๋ฅธ ๊ฐ ๋ฐ์ธ๋ฉํ๊ธฐ
๋ณ๋์ ์ธ์๋ก this
๋ฅผ ๋ฐ๋ ํจ์์ ๊ฒฝ์ฐ์๋ ์ํ๋ ๊ฐ์ ๋๊ฒจ์ฃผ๋ฉด ๋์ง๋ง, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ this
์ ์ ์ด๊ถ๋ ๋๊ฒจ์ฃผ๊ฒ ๋๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์์๋ก ๋ฐ๊ฟ ์ ์๋ค.
:: ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this
์ ๋ค๋ฅธ ๊ฐ์ ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ
(1) ๋ณ์์ ๋ด๊ธฐ
(์ ํต์ ์ธ ๋ฐฉ์) ์ ์ฌ์ฉํ์ง ์๋๋ค โ
์ฝ๋ฐฑ ํจ์๋ก ํ์ฉํ ํจ์์์๋ this๋ฅผ ๋ค๋ฅธ ๋ณ์
์ ๋ด์ this
๋์ ๊ทธ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฒ ํ๊ณ , ์ด๋ฅผ ํด๋ก์ ๋ก ๋ง๋๋ ๋ฐฉ์์ด ๋ง์ด ์ฐ์๋ค.
(2) bind ๋ฉ์๋ ํ์ฉ +ES5
const obj = {
name: 'yrKim',
func: () => console.log(this.name);
};
setTimeout(obj.func.bind(obj), 1000);
const obj2 = { name: 'april' }
setTimeout(obj.func.bind(obj2), 1500);
:: ๐ฉ ์ฝ๋ฐฑ ์ง์ฅ๊ณผ ๋น๋๊ธฐ ์ ์ด
์ฝ๋ฐฑ ์ง์ฅ(callback hell)์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ต๋ช ํจ์๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋์ด ์ฝ๋์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ๊ฐ๋นํ๊ธฐ ํ๋ค ์ ๋๋ก ๊น์ด์ง๋ ํ์์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ..๐ฅฒ๐ฅฒ
โ ๋น๋๊ธฐ์ ์ธ ์ฝ๋: ์ฆ์ ์คํ์ด โ ์๋, โ ๋ณ๋์ ์์ฒญ, ์คํ ๋๊ธฐ, ๋ณด๋ฅ ๋ฑ๊ณผ ๊ด๋ จ๋ ์ฝ๋
(1) +ES6
์ Promise
๋ฅผ ์ด์ฉํ ๋ฐฉ์
new Promise((resolve) => {
setTimeout(() => {
let name = "์์คํ๋ ์";
console.log(name);
resoleve(name);
}, 500);
})
.then((prevName) => {
new Promise((resolve) => {
setTimeout(() => {
let name = prevName + ", ์๋ฉ๋ฆฌ์นด๋
ธ";
console.log(name);
resoleve(name);
}, 500);
});
})
.then((prevName) => {
new Promise((resolve) => {
setTimeout(() => {
let name = prevName + ", ์นดํ๋ผ๋ผ";
console.log(name);
resoleve(name);
}, 500);
});
});
promise
์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ์ฝ๋ฐฑ ํจ์๋ ํธ์ถํ ๋ ๋ฐ๋ก ์คํ๋์ง๋ง- ๊ทธ ๋ด๋ถ์
resolve
๋๋reject
ํจ์๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ์ด ์์ ๊ฒฝ์ฐ,- ๋ ์ค ํ๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋
.then
๋๋ ์ค๋ฅ ๊ตฌ๋ฌธcatch
๋ก ๋์ด๊ฐ์ง ์๋๋ค - ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋ ๋
resolve
๋๋reject
๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋น๋๊ธฐ ์์ ์ ๋๊ธฐ์ ํํ์ด ๊ฐ๋ฅํ๋ค
- ๋ ์ค ํ๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋
(2) Promise
+ Async/await
const addCoffee = (name) => {
return new Promise((resolve) => {
setTimeout((
resolve(name);
), 500);
});
};
const coffeeMaker = async () => {
let coffeeList = '';
const _addCoffee = async (name) => {
coffeeList += (coffeeList ? ',' : '') +
await addCoffee(name);
}
await _addCoffee('์์คํ๋ ์');
console.log(coffeeList);
await _addCoffee('์๋ฉ๋ฆฌ์นด๋
ธ');
console.log(coffeeList);
await _addCoffee('์นดํ๋ผ๋ผ');
console.log(coffeeList);
await _addCoffee('์นดํ๋ชจ์นด');
console.log(coffeeList);
};
coffeeMaker();
ES2017์์ ๋ฑ์ฅํ Async/await
๋ ๊ฐ๋
์ฑ์ด ๋ฐ์ด๋๊ณ , ์์ฑ๋ฒ์ด ๊ฐ๋จํ๋ค๋ ์ฅ์ ์ด ์๋ค.
- ๋น๋๊ธฐ ์์
์ ์ํํ๊ณ ์ ํ๋ ํจ์ ์์
async
ํค์๋๋ฅผ ๋ถํ์ฃผ๊ณ , - ํจ์ ๋ด๋ถ์์ ์ค์ง์ ์ธ ๋น๋๊ธฐ ์์
์ด ํ์ํ ์์น๋ง๋ค
await
ํค์๋๋ฅผ ๋ถํ์ฃผ๋ฉด - ๋ค์ ๋ด์ฉ์
Promise
๋ก ์๋ ์ ํํ๊ณ , ํด๋น ๋ด์ฉ์ด resolve๋ ์ดํ์ ๋ค์์ผ๋ก ์งํํ๋ค.
์ฆ, Promise
์ .then
๊ณผ ํก์ฌํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
โจ tl;dr
- ์ฝ๋ฐฑ ํจ์๋ ๋ค๋ฅธ ์ฝ๋์ ์ธ์๋ฅผ ๋๊ฒจ์ค์ผ๋ก์จ ๊ทธ ์ ์ด๊ถ๋ ํจ๊ป ์์ํ ํจ์์ด๋ค.
- ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ์ฝ๋๋
- ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ ์์ ์ ์ค์ค๋ก ํ๋จํด์ ์คํ
- ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ๋๊ฒจ์ค ๊ฐ๋ค ๋ฐ ๊ทธ ์์๊ฐ ์ ํด์ ธ ์๋ค. ์ด ์์๋ฅผ ๋ฐ๋ฅด์ง ์๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๋ฑํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋๋ ์ฃผ์!
- ์ฝ๋ฐฑ ํจ์์
this
๊ฐ ๋ฌด์์ ๋ฐ๋ผ๋ณด๋๋ก ํ ์ง๊ฐ ์ ํด์ ธ ์๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ, ์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ ์ญ๊ฐ์ฒด(window)๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.- ์ฌ์ฉ์ ์์๋ก
this
๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐbind
๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
- ์ฌ์ฉ์ ์์๋ก
- ์ด๋ค ํจ์์ ์ธ์๋ก ๋ฒ ์๋๋ฅผ ์ ๋ฌํ๋๋ผ๋ ๊ฒฐ๊ตญ ํจ์๋ก์ ์คํ๋๋ค
- ๋น๋๊ธฐ ์ ์ด๋ฅผ ์ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ๋์
Promise
+Async/await
์ ์ด์ฉํ๋ฉด ๋๋ค