π Chapter 4: μ½λ°± ν¨μ
π μ½λ°± ν¨μλ?β
- μ½λ°± ν¨μ(callback function)λ λ€λ₯Έ μ½λμ μΈμλ‘ λ겨주λ ν¨μμ΄λ€. μ½λ°± ν¨μλ₯Ό λ겨λ°μ μ½λλ μ΄ μ½λ°± ν¨μλ₯Ό νμμ λ°λΌ μ μ ν μμ μ μ€νν κ²μ΄λ€.
- μ½λ°± ν¨μλ λ€λ₯Έ μ½λ(ν¨μ λλ λ©μλ)μκ² μΈμλ‘ λ겨μ€μΌλ‘μ¨ κ·Έ μ μ΄κΆλ ν¨κ» μμν ν¨μμ΄λ€. μ½λ°± ν¨μλ₯Ό μμλ°μ μ½λλ μ체μ μΈ λ΄λΆ λ‘μ§μ μν΄ μ΄ μ½λ°± ν¨μλ₯Ό μ μ ν μμ μ μ€νν κ²μ΄λ€.
π μ μ΄κΆβ
π νΈμΆ μμ β
- μ½λ°± ν¨μ μμ
setInterval
var count = 0;
var cbFunc = function () {
console.log(count);
it (++count > 4) {
clearInterval(timer);
}
};
var timer = setInterval(cbFunc, 300);
- μ΄ μ½λλ₯Ό μ€ννλ©΄ 0.3μ΄μ ν λ²μ© μ«μ 0λΆν° 1μ© μ¦κ°νλ©° μΆλ ₯λλ€ 4κ° μΆλ ₯λ μ΄ν μ’ λ£λλ€.
setInterval
μ΄λΌκ³ νλ λ€λ₯Έ μ½λμ 첫 λ²μ§Έ μΈμλ‘μ¨cbFunc
ν¨μλ₯Ό λ겨주μ μ μ΄κΆμ λ겨λ°μsetInterval
μ΄ μ€μ€λ‘μ νλ¨μ λ°λΌ μ μ ν μμ μ(0.3μ΄λ§λ€) μ΅λͺ ν¨μλ₯Ό μ€ννλ€.- μ΄μ²λΌ μ½λ°± ν¨μμ μ μ΄κΆμ λ겨λ°μ μ½λλ μ½λ°± ν¨μ νΈμΆ μμ μ λν μ μ΄κΆμ κ°μ§λ€.
π μΈμβ
var newArr = [10, 20, 30].map(function (currentValue, index) {
return currentValue + 5;
});
console.log(newArr); // [15, 25, 35]
map
λ©μλμ μ μλ κ·μΉμλ μ½λ°± ν¨μμ μΈμλ‘ λμ΄μ¬ κ°λ€ λ° κ·Έ μμλ ν¬ν¨λΌ μλ€. μ½λ°± ν¨μλ₯Ό νΈμΆνλ μ£Όμ²΄κ° μ¬μ©μκ° μλmap
λ©μλμ΄λ―λ‘map
λ©μλκ° μ½λ°± ν¨μλ₯Ό νΈμΆν λ μΈμμ μ΄λ€ κ°λ€μ μ΄λ€ μμλ‘ λκΈΈ κ²μΈμ§κ° μ μ μΌλ‘map
λ©μλμκ² λ¬λ¦° κ²μ΄λ€.- μ΄μ²λΌ μ½λ°± ν¨μμ μ μ΄κΆμ λ겨λ°μ μ½λλ μ½λ°± ν¨μλ₯Ό νΈμΆν λ μΈμμ μ΄λ€ κ°λ€μ μ΄λ€ μμλ‘ λκΈΈ κ²μΈμ§μ λν μ μ΄κΆμ κ°μ§λ€.
π thisβ
- μ½λ°± ν¨μλ ν¨μμ΄κΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘λ
this
κ° μ μκ°μ²΄λ₯Ό μ°Έμ‘°νμ§λ§, μ μ΄κΆμ λ겨λ°μ μ½λμμ μ½λ°± ν¨μμ λ³λλ‘this
κ° λ λμμ μ§μ ν κ²½μ°μλ κ·Έ λμμ μ°Έμ‘°νκ² λλ€.
// Array.prototype.map - ꡬν
Array.prototype.map = function (callback, thisArg) {
var mappedArr = [];
for (var i = 0; i < this.length; i++) {
var mappedArr = callback.call(thisArg || window, this[i], i, this);
mappedArr[i] = mappedValue;
}
return mappedArr;
};
- λ©μλ ꡬνμ ν΅μ¬μ
call
/apply
λ©μλμ μλ€.this
μλthisArg
κ°μ΄ μμ κ²½μ°μλ κ·Έ κ°μ, μμ κ²½μ°μλ μ μκ°μ²΄λ₯Ό μ§μ νκ³ , 첫 λ²μ§Έ μΈμμλ λ©μλμthis
κ° λ°°μ΄μ κ°λ¦¬ν¬ κ²μ΄λ―λ‘ λ°°μ΄μi
μμ κ°μ, λ λ²μ§Έ μΈμμλi
κ°μ, μΈ λ²μ§Έ μΈμμλ λ°°μ΄ μ체λ₯Ό μ§μ ν΄ νΈμΆνλ€. - κ·Έ κ²°κ³Όκ° λ³μ
mappedValue
μ λ΄κ²¨mappedArr
μi
λ²μ¬ μΈμμ ν λΉλλ€. - μ μ΄κΆμ λ겨λ°μ μ½λμμ
call
/apply
λ©μλμ 첫 λ²μ§Έ μΈμμ μ½λ°± ν¨μ λ΄λΆμμμthis
κ° λ λμμ λͺ μμ μΌλ‘ λ°μΈλ©νκΈ° λλ¬Έμ΄λ€.
// μ½λ°± ν¨μ λ΄λΆμμμ this
setTimeout(function () { console.log(this); }, 300); // Window {...}
[1, 2, 3, 4, 5].forEach(function (x) {
console.log(this); // Window {...}
});
document.body.innerHTML += '<button id="a">ν΄λ¦</button>';
document.body.querySelector('#a')
.addEventListener('click', function (e) {
console.log(this, e); // <button id="a">ν΄λ¦</button> MouseEvent { isTrusted: true, ... }
});
π μ½λ°± ν¨μλ ν¨μλ€β
- μ½λ°± ν¨μλ‘ μ΄λ€ κ°μ²΄μ λ©μλλ₯Ό μ λ¬νλλΌλ κ·Έ λ©μλλ λ©μλκ° μλ ν¨μλ‘μ νΈμΆλλ€.
// λ©μλλ₯Ό μ½λ°± ν¨μλ‘ μ λ¬ν κ²½μ°
var obj = {
vals: [1, 2, 3],
logValues: function (v, i) {
console.log(this, v, i);
}
};
obj.logValues(1, 2); // { vals: [1, 2, 3], logValues: f } 1 2
[4, 5, 6].forEach(obj.logValues); // Window { ... } 4 0 ...
forEach
ν¨μμ μ½λ°± ν¨μλ‘μ μ λ¬ν κ²μobj
λ₯Όthis
λ‘ νλ λ©μλλ₯Ό κ·Έλλ‘ μ λ¬ν κ²μ΄ μλλΌ,obj.logValues
κ° κ°λ¦¬ν€λ ν¨μλ§ μ λ¬ν κ²μ΄λ€. μ΄ ν¨μλ λ©μλλ‘μ νΈμΆν λκ° μλ νobj
μμ μ§μ μ μΈ μ°κ΄μ΄ μμ΄μ§λ€.forEach
μ μν΄ μ½λ°± ν¨μλ‘μ νΈμΆλκ³ , λ³λλ‘this
λ₯Ό μ§μ νλ μΈμλ₯Ό μ§μ νμ§ μμμΌλ―λ‘ ν¨μ λ΄λΆμμμthis
λ μ μκ°μ²΄λ₯Ό λ°λΌλ³΄κ² λλ€.
π μ½λ°± ν¨μ λ΄λΆμ thisμ λ€λ₯Έ κ° λ°μΈλ©νκΈ°β
this
λ₯Ό λ€λ₯Έ λ³μμ λ΄μ μ½λ°± ν¨μλ‘ νμ©ν ν¨μμμλthis
λμ κ·Έ λ³μλ₯Ό μ¬μ©νκ² νκ³ , μ΄λ₯Ό ν΄λ‘μ λ‘ λ§λ€μ΄ μ¬μ©ν μ μλ€.
// μ½λ°± ν¨μ λ΄λΆμ thisμ λ€λ₯Έ κ°μ λ°μΈλ©νλ λ°©λ² - μ ν΅μ μΈ λ°©μ
var obj1 = {
name: 'obj1',
func: function () {
var self = this; // ν΄λ‘μ
return function () {
console.log(self.name);
};
}
};
var callback = obj1.func();
setTimeout(callback, 1000);
// obj1
- μ½λ°± ν¨μ λ΄λΆμμ
this
λ₯Ό μ¬μ©νμ§ μλ κ²½μ°
var obj1 = {
name: 'obj1',
func: function() {
console.log(obj1.name);
}
};
setTimeout(obj1.func, 1000);
// obj1
this
λ₯Ό μ¬μ©νμ§ μμμ λλ κ°κ²°νκ³ μ§κ΄μ μ΄μ§λ§ μ΄μ λ μμ±ν ν¨μλ₯Όthis
λ₯Ό μ΄μ©ν΄ λ€μν μν©μ μ¬νμ©ν μ μκ² λμλ€.
// thisμ λ€λ₯Έ κ°μ λ°μΈλ©νλ λ°©λ²μ μ¬νμ©
var obj1 = {
name: 'obj1',
func: function () {
var self = this; // ν΄λ‘μ
return function () {
console.log(self.name);
};
}
};
var obj2 = {
name: 'obj2',
func: obj1.func
};
var callback2 = obj2.func();
setTimeout(callback2, 1500);
var obj3 = { name: 'obj3' };
var callback3 = obj1.func.call(obj3);
setTimeout(callback3, 2000);
// obj2
// obj3
- μ΄ κ²½μ°
this
λ₯Ό μ°νμ μΌλ‘λλ§ νμ©ν¨μΌλ‘μ¨ λ€μν μν©μμ μνλ κ°μ²΄λ₯Ό λ°λΌλ³΄λ μ½λ°± ν¨μλ₯Ό λ§λ€ μ μλ€. - λ°λ©΄μ μ½λ°± ν¨μ λ΄λΆμμ
this
λ₯Ό μ¬μ©νμ§ μλ κ²½μ°λ λͺ μμ μΌλ‘obj1
μ μ§μ νκΈ° λλ¬Έμ μ΄λ€ λ°©λ²μΌλ‘λ λ€λ₯Έ κ°μ²΄λ₯Ό λ°λΌλ³΄κ²λ ν μ μλ€. λν λ©λͺ¨λ¦¬λ₯Ό λλΉνλ μΈ‘λ©΄μ΄ μμμλ μ ν΅μ μΈ λ°©μμ΄ λ리 ν΅μ©λ μλ°μ μμλ μΈ‘λ©΄λ μλ€. - ES5μ λ±μ₯ν
bind
λ©μλλ₯Ό μ΄μ©νλ©΄ κ°λ¨ν ꡬνν μ μλ€.
var obj1 = {
name: 'obj1',
func: function() {
console.log(this.name);
}
};
setTimeout(obj1.func.bind(obj1), 1000);
var obj2 = { name: 'obj2' };
setTimeout(obj1.func.bind(obj2), 1500);
π μ½λ°± μ§μ₯κ³Ό λΉλκΈ° μ μ΄β
- μ½λ°± μ§μ₯μ μ½λ°± ν¨μλ₯Ό μ΅λͺ ν¨μλ‘ μ λ¬νλ κ³Όμ μ΄ λ°λ³΅λμ΄ μ½λμ λ€μ¬μ°κΈ° μμ€μ΄ κ°λΉνκΈ° νλ€ μ λλ‘ κΉμ΄μ§λ νμμΌλ‘ μ£Όλ‘ μ΄λ²€νΈ μ²λ¦¬λ μλ² ν΅μ κ³Ό κ°μ΄ λΉλκΈ°μ μΈ μμ μ μννκΈ° μν΄ μ΄λ° ννκ° μμ£Ό λ±μ₯νλλ°, κ°λ μ±μ΄ λ¨μ΄μ§λΏλλ¬ μ½λλ₯Ό μμ νκΈ°λ μ΄λ ΅λ€.
- μΉλΈλΌμ°μ μμ²΄κ° μλ λ³λμ λμμ 무μΈκ°λ₯Ό μμ²νκ³ κ·Έμ λν μλ΅μ΄ μμ λ λΉλ‘μ μ΄λ€ ν¨μλ₯Ό μ€ννλλ‘ λκΈ°νλ λ±, λ³λμ μμ³₯, μ€ν λκΈ°, 보λ₯ λ±κ³Ό κ΄λ ¨λ μ½λλ λΉλκΈ°μ μ½λμ΄λ€.
// μ½λ°± μ§μ₯
setTimeout(function (name) {
var coffeeList = name;
console.log(coffeeList);
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
}, 500, 'μΉ΄νλΌλΌ');
}, 500, 'μΉ΄νλͺ¨μΉ΄');
}, 500, 'μλ©λ¦¬μΉ΄λ
Έ');
}, 500, 'μμ€νλ μ');
- μ΄ κ²½μ° λ€μ¬μ°κΈ° μμ€μ΄ κ³Όλνκ² κΉμ΄μ‘μλΏλλ¬ κ°μ΄ μ λ¬λλ μμκ° μλμ μλ‘ ν₯νκ³ μμ΄ μ΄μνκ² λκ»΄μ§λ€.
- μ΄κ±Έ ν΄κ²°νλλ° κ°μ₯ κ°λ¨ν λ°©λ²μ μ΅λͺ μ μ½λ°± νμλ₯Ό λͺ¨λ κΈ°λͺ ν¨μλ‘ μ ννλ κ²μ΄λ€.
var coffeeList = '';
var addEspresso = function (name) {
coffeeList = name;
console.log(coffeeList);
setTimeout(addAmericano, 500 'μλ©λ¦¬μΉ΄λ
Έ');
}
var addAmericano = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(addMocha, 500 'μΉ΄νλͺ¨μΉ΄');
}
var addMocha = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(addLatte, 500 'μΉ΄νλΌλΌ');
}
var addLatte = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
}
setTimeout(addEspresso, 500, 'μμ€νλ μ');
- μ΄ λ°©μμ μ½λμ κ°λ μ±μ λμ΄κ³ ν¨μ μ μΈκ³Ό ν¨μ νΈμΆλ§μ ꡬλΆν μ μλ€λ©΄ μμμλΆν° μλλ‘ μμλλ‘ μ½μ΄λ΄λ €κ°λ λ° μ΄λ €μμ΄ μλ€.
- νμ§λ§, μΌνμ± ν¨μ γΉ μ λΆ λ³μμ ν λΉνλ κ²μ΄ μ’μ§ λͺ»νλ€.
Promise
λ₯Ό μ¬μ©νμ¬ ν΄κ²°ν μ μλ€.
new Promise(function (resolve) {
setTimeout(function () {
var name = 'μμ€νλ μ';
console.log(name);
resolve(name);
}, 500);
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
var name = prevName + ', μλ©λ¦¬μΉ΄λ
Έ';
console.log(name);
resolve(name);
}, 500);
})l
}).then(function (prevName) {
// ...
}).then(function (prevName) {
// ...
});
- λ€μμ
Promise
λ₯Ό λ€λ₯Έλ°©λ²μΌλ‘ μ¬μ©ν μμ΄λ€.
var addCoffee = function (name) {
return function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
var newName = prevName ? (prevName + ', ' + name) : name;
console.log(newName);
resolve(newName);
}, 500);
});
};
};
addCoffee('μμ€νλ μ')()
.then(addCoffee('μλ©λ¦¬μΉ΄λ
Έ'))
.then(addCoffee('μΉ΄νλͺ¨μΉ΄'))
.then(addCoffee('μΉ΄νλΌλΌ'));
- λ€μμ μ λλ μ΄ν°λ₯Ό μ¬μ©ν λ°©λ²μ΄λ€.
var addCoffee = function(prevName, name) {
setTimeout(function () {
coffeeMaker.next(prevName ? prevName + ', ' + name : name);
}, 500);
};
var coffeeGenerator = function* () {
var espresso = yield addCoffee('', 'μμ€νλ μ');
console.log(espresso);
var americano = yield addCoffee(espresso, 'μλ©λ¦¬μΉ΄λ
Έ');
console.log(americano);
var mocha = yield addCoffee(americano, 'μΉ΄νλͺ¨μΉ΄');
console.log(mocha);
var latte = yield addCoffee(mocha, 'μΉ΄νλΌλΌ');
console.log(latte);
};
var coffeeMaker = coffeeGenerator();
coffeeMaker.next();
- λ€μμ
Promise
μAsync/await
λ₯Ό μ¬μ©ν μμ μ΄λ€.
var addCoffee = function (name) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(name);
}, 500);
});
};
var coffeeMaker = async function () {
var coffeeList = '';
var _addCoffee = async function (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();
π μ 리β
- μ½λ°± ν¨μλ λ€λ₯Έ μ½λμ μΈμλ₯Ό λ겨μ€μΌλ‘μ¨ κ·Έ μ μ΄κΆλ ν¨κ» μμν ν¨μμ΄λ€.
- μ μ΄κΆμ λ겨λ°μ μ½λλ λ€μκ³Ό κ°μ μ μ΄κΆμ κ°μ§λ€.
- μ½λ°± ν¨μλ₯Ό νΈμΆνλ μμ μ μ€μ€λ‘ νλ¨ν΄μ μ€ννλ€.
- μ½λ°± ν¨μλ₯Ό νΈμΆν λ μΈμλ‘ λ κ²¨μ€ κ°λ€ λ° κ·Έ μμκ° μ ν΄μ Έ μλ€. μ΄ μμλ₯Ό λ°λ₯΄μ§ μκ³ μ½λλ₯Ό μμ±νλ©΄ κΈ°λνλ κ°κ³Ό λ€λ₯Έ κ²°κ³Όλ₯Ό μ»κ² λλ€.
- μ½λ°± ν¨μμ
this
κ° λ¬΄μμ λ°λΌλ³΄λλ‘ ν μ§κ° μ ν΄μ Έ μλ κ²½μ°λ μλ€. μ νμ§ μμ κ²½μ°μλ μ μκ°μ²΄λ₯Ό λ°λΌλ³Έλ€. μ¬μ©μ μμλ‘this
λ₯Ό λ°κΎΈκ³ μΆμ κ²½μ°bind
λ©μλλ₯Ό νμ©νλ©΄ λλ€.
- μ΄λ€ ν¨μμ μΈμλ‘ λ©μλλ₯Ό μ λ¬νλλΌλ μ΄λ κ²°κ΅ ν¨μλ‘μ μ€νλλ€.
- λΉλκΈ° μ μ΄λ₯Ό μν΄ μ½λ°± ν¨μλ₯Ό μ¬μ©νλ€ λ³΄λ©΄ μ½λ°± μ§μ₯μ λΉ μ§κΈ° μ½λ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν λ°©λ²μΌλ‘
Promise
,Generator
,async/await
λ± μ½λ°± μ§μ₯μΌλ‘ λΆν° λ²μ΄λ μ μλ€.