본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 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();

πŸ“š 정리​

  • 콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ μ½”λ“œμ— 인자λ₯Ό λ„˜κ²¨μ€ŒμœΌλ‘œμ¨ κ·Έ μ œμ–΄κΆŒλ„ ν•¨κ»˜ μœ„μž„ν•œ ν•¨μˆ˜μ΄λ‹€.
  • μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 μ œμ–΄κΆŒμ„ 가진닀.
    1. 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ‹œμ μ„ 슀슀둜 νŒλ‹¨ν•΄μ„œ μ‹€ν–‰ν•œλ‹€.
    2. 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 인자둜 념겨쀄 κ°’λ“€ 및 κ·Έ μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆλ‹€. 이 μˆœμ„œλ₯Ό λ”°λ₯΄μ§€ μ•Šκ³  μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ κΈ°λŒ€ν•˜λŠ” κ°’κ³Ό λ‹€λ₯Έ κ²°κ³Όλ₯Ό μ–»κ²Œ λœλ‹€.
    3. 콜백 ν•¨μˆ˜μ˜ thisκ°€ 무엇을 바라보도둝 할지가 μ •ν•΄μ Έ μžˆλŠ” κ²½μš°λ„ μžˆλ‹€. μ •ν•˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ” 전역객체λ₯Ό 바라본닀. μ‚¬μš©μž μž„μ˜λ‘œ thisλ₯Ό λ°”κΎΈκ³  싢을 경우 bind λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ λœλ‹€.
  • μ–΄λ–€ ν•¨μˆ˜μ— 인자둜 λ©”μ„œλ“œλ₯Ό μ „λ‹¬ν•˜λ”λΌλ„ μ΄λŠ” κ²°κ΅­ ν•¨μˆ˜λ‘œμ„œ μ‹€ν–‰λœλ‹€.
  • 비동기 μ œμ–΄λ₯Ό μœ„ν•΄ 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ‹€ 보면 콜백 지μ˜₯에 빠지기 쉽닀. 이 문제λ₯Ό ν•΄κ²°ν•  λ°©λ²•μœΌλ‘œ Promise, Generator, async/await λ“± 콜백 지μ˜₯으둜 λΆ€ν„° λ²—μ–΄λ‚  수 μžˆλ‹€.