κ°μΈ 곡λΆλ₯Ό μν΄ μμ±νμ΅λλ€
μ½λ°± ν¨μ(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 |
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
μ λ€λ₯Έ κ°μ λ°μΈλ© νλ λ°©λ²
(μ ν΅μ μΈ λ°©μ) μ μ¬μ©νμ§ μλλ€ β
μ½λ°± ν¨μλ‘ νμ©ν ν¨μμμλ thisλ₯Ό λ€λ₯Έ λ³μ
μ λ΄μ this
λμ κ·Έ λ³μλ₯Ό μ¬μ©νκ² νκ³ , μ΄λ₯Ό ν΄λ‘μ λ‘ λ§λλ λ°©μμ΄ λ§μ΄ μ°μλ€.
+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)μ μ½λ°± ν¨μλ₯Ό μ΅λͺ ν¨μλ‘ μ λ¬νλ κ³Όμ μ΄ λ°λ³΅λμ΄ μ½λμ λ€μ¬μ°κΈ° μμ€μ΄ κ°λΉνκΈ° νλ€ μ λλ‘ κΉμ΄μ§λ νμμΌλ‘ μλ°μ€ν¬λ¦½νΈμμλ νν λ°μνλ λ¬Έμ ..π₯²π₯²
β λΉλκΈ°μ μΈ μ½λ: μ¦μ μ€νμ΄ β μλ, β λ³λμ μμ², μ€ν λκΈ°, 보λ₯ λ±κ³Ό κ΄λ ¨λ μ½λ
+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
λ₯Ό νΈμΆνλ λ°©λ²μΌλ‘ λΉλκΈ° μμ
μ λκΈ°μ ννμ΄ κ°λ₯νλ€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
κ³Ό ν‘μ¬ν ν¨κ³Όλ₯Ό μ»μ μ μλ€.
this
κ° λ¬΄μμ λ°λΌλ³΄λλ‘ ν μ§κ° μ ν΄μ Έ μλ κ²½μ°λ μλλ°, μ νμ§ μμ κ²½μ°μλ μ μκ°μ²΄(window)λ₯Ό λ°λΌλ³Έλ€.this
λ₯Ό λ°κΎΈκ³ μΆμ κ²½μ° bind
λ©μλλ₯Ό νμ©νλ©΄ λλ€.Promise
+ Async/await
μ μ΄μ©νλ©΄ λλ€