ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด console.log๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์๋๋ฐ์. ์ ๋ console.log๋ฅผ ์ฌ์ฉํ ๋ ๋ง๋ค ์ฝ๊ฐ์ ๋ถํธํ ์ ์ด ์์ด์ console.log์ฉ ์ ํธ์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ ๋ฐฉ์์๋ ๋ถํธํ ์ ์ด ์์๋๋ฐ bind๋ฅผ ํ์ฉํด์ ๋ก๊ทธ ์ ํธ์ ๊ฐ์ ํ๋ ๋ฌธ์ ์ ์ด ํด๊ฒฐ๋์์ต๋๋ค. ์ด๋ฒ ๊ธ์ ์ด๋ฐ ์ ๊ฒฝํ์ ๊ณต์ ํ๊ธฐ ์ํด ์์ฑํ์ต๋๋ค.
console.log๋ฅผ ์ฌ์ฉํ ๋ ๋ถํธํ ์
ํ๋ก์ ํธ์ no-console๊ฐ์ ๋ฆฐํธ ๊ท์น์ด ์ ์ธ๋์ด ์๋ ๊ฒฝ์ฐ console.log๋ฅผ ์ฝ๋๋ฒ ์ด์ค์ ์ถ๊ฐํ๋ฉด no-console๊ฐ์ ๊ท์น ๋๋ฌธ์ ์๋ฌ๋ warning์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ๋ฆฐํธ ๊ท์น์ ์ ๋ถ ๋นํ์ฑํํ๋ฉด, ํ๋ก๋์
์ฝ๋์ ๋ก๊ทธ๊ฐ ๊ทธ๋๋ก ํฌํจ๋ ์ฑ๋ก ์ฌ๋ผ๊ฐ๋ ์ค์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐ ๋ชจ๋์์๋ง ๋ก๊ทธ๊ฐ ํ์ฑํ๋๋๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํด์ ํด๊ฒฐํ ์ ์์ง๋ง, ๋ก๊ทธ๋ฅผ ํธ์ถํ๋ ๋ชจ๋ ์์น์์ ์กฐ๊ฑด๋ฌธ์ ์์ฑํด์ผ ํด์ ๊ฐ๋
์ฑ์ด ์ ํ๋๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
if (IS_LOCAL) {
log.info('debug log');
}์ฒ์์ ๊ณ ์ํ๋ ํด๊ฒฐ์ฑ ๊ณผ ํ๊ณ
์ ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณดํต์ ๋ก๊ทธ ์ ์ฉ ์ ํธ์ ๋ฐ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํฉ๋๋ค.
// log.ts
const noop = () => {};
export const log = {
error: (...args) => IS_LOCAL ? console.error(...args) : noop(),
info: (...args) => IS_LOCAL ? console.log(...args) : noop(),
};์ด๋ ๊ฒ ํ๋ฉด ๋ฆฐํธ ๊ท์น ๋ฌด์, ๊ฐ๋ฐ๋ชจ๋ ๋ถ๊ธฐ๋ ์ ํธ์์๋ง ์ฒ๋ฆฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์์์ ๋งํ ๋ฌธ์ ์ ์ด ๋ชจ๋ ํด๊ฒฐ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์น๋ช ์ ์ธ ๋จ์ ์ด ํ๋ ์์ต๋๋ค. ๋ฐ๋ก log ์ ํธ ๊ฐ์ฒด์์ ํธ์ถํ๋ ํจ์๊ฐ ํ๋์ JavaScript ํจ์์ด๊ธฐ ๋๋ฌธ์ ํธ์ถ ์ ์๋ก์ด ์คํ ํ๋ ์์ด ์์ฑ๋๋ ๊ฒ์ ๋๋ค.
๋ก๊ทธ ํธ์ถ ๋ถ๋ถ โ log.error โ console.error๊ทธ ๊ฒฐ๊ณผ DevTools์์ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ฉด ํธ์ถ ์์น๊ฐ ํญ์ log.ts๋ก ๊ณ ์ ๋ฉ๋๋ค.
๋๋ฒ๊น
์ ์ํด ๋ก๊ทธ๋ฅผ ์ฐ์๋๋ฐ, ์ ์ ์ค์ํ 'ํธ์ถ ์ถ์ฒ'๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๋ค๋ ๋ถํธํจ์ด ์๊น๋๋ค.
ํด๊ฒฐ์ฑ (bind)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ bind๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ ์ ํธ์ ๋ง๋๋ ๊ฒ์
๋๋ค.
// log. ts
const noop = () => {};
export const log = {
error: IS_LOCAL ? console.error.bind(console, '%c[ERROR]', 'color: red; font-weight: bold') : noop,
info: IS_LOCAL ? console.info.bind(console, '%c[INFO]', 'color: blue; font-weight: bold') : noop,
};์ด๋ ๊ฒ ํ๋ฉด Devtools์ ์คํ ํธ๋ ์ด์ค์ log.ts๊ฐ ํฌํจ๋์ง ์์ log.error()๋ฅผ ํธ์ถํ ์ค์ ์์น๊ฐ ๊ทธ๋๋ก ํ์๋ฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก bind๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ ์ ํธ์ ์ ์งํ๋ฉด์๋ ์คํ ํธ๋ ์ด์ค์ log.ts ํ์ผ์ด ์ถ๊ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๊ทธ๋ฅผ ํธ์ถํ ์์น๋ฅผ Devtools์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ bind๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ํธ๋ ์ด์ค์ log.tsํ์ผ์ด ํฌํจ๋์ง ์๋๊ฑธ๊น์? ์ด๋ ๋จ์ํ ๋ฌธ๋ฒ ํธ๋ฆญ์ด ์๋๋ผ ECMAScript ์คํ ์์ค์์ bind ๋์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ bind์ ํ์ดํ ํจ์๋ ์คํ ํธ๋ ์ด์ค์์ ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๊น์? ์ด๋ฅผ ์ดํดํ๋ ค๋ฉด bind๊ฐ ๋ง๋ค์ด๋ด๋ ํน์ด ํจ์ ๊ฐ์ฒด(exotic function object)์ ๋ํด ์์๋ณผ ํ์๊ฐ ์์ต๋๋ค.
์ bind๋ ๋ค๋ฅผ๊น?
MDN์ bind ๊ณต์ ๋ฌธ์ ๋ถ๋ถ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ช ์ด ๋์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ํน์ด ํจ์ ๊ฐ์ฒด๋ ๋ฌด์์ผ๊น์? ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋จผ์ JavaScript์ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋ถ๋ฅ๋๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
JavaScript์ ๊ฐ์ฒด ๋ถ๋ฅ
JavaScript์ ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
Javascript์ ๋๋ถ๋ถ์ ๋ด์ฅ ๊ฐ์ฒด๋ค์ ๊ธฐ๋ณธ Object๋ฅผ ์์๋ฐ์ ๊ตฌํ๋์ด์์ต๋๋ค. prototype์ ์ญ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด ์ข
์ฐฉ์ง๊ฐ Object๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ์. ์ด๋ฐ ๊ฐ์ฒด๋ค๋ ๋ถ๋ฅ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ๋งํ๋ ๊ฐ์ฒด์, ๊ทธ ๊ฐ์ฒด๋ฅผ ์์๋ฐ์ ๊ตฌํ๋์์ง๋ง ํน์ด ๋์์ด ์ถ๊ฐ๋ ํน์ด ๊ฐ์ฒด๋ค, ๊ทธ๋ฆฌ๊ณ ๊ทธ ํน์ด ๊ฐ์ฒด์ค์์๋ ํจ์๊ฐ์ฒด์, ํจ์์ค์์๋ ํน์ด ๋์์ด ์๋ ํน์ด ํจ์ ๊ฐ์ฒด๊ฐ ์๋๋ฐ์. ๊ทธ๋ผ ์ด ๋ถ๋ฅ๋ค์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Ordinary Object (์ผ๋ฐ ๊ฐ์ฒด)
const obj = {
a: 1,
b: 2,
c: 3,
};๋จผ์ ์ผ๋ฐ ๊ฐ์ฒด๋ {} ๋๋ new Object()๋ก ์์ฑ๋๋ ์ฐ๋ฆฌ๊ฐ ํํ ์๋ ๊ฐ์ฒด์
๋๋ค. ECMAScript์ ๊ธฐ๋ณธ ๋ด๋ถ ๋ฉ์๋(ordinary behavior) ๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ฅด๊ณ , ํ๋กํผํฐ ์ถ๊ฐ / ์์ / ์ญ์ ๊ฐ ์ง๊ด์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ฝ์์ฐฝ์์ ์ถ๋ ฅํ์ ๋ prototype ์ฒด์ธ ๋ฐ๋ก ์์ชฝ์ Object๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์ผ๋ฐ ๊ฐ์ฒด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ์ต๋๋ค.
Exotic Object (ํน์ด ๊ฐ์ฒด)
๊ทธ๋ ๋ค๋ฉด ํน์ด ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด๋ ๋ฌด์์ด ๋ค๋ฅด๊ฒ "ํน์ด"์ผ๊น์? ์ฌ์ค ๊ทธ๋ ๊ฒ ํน๋ณํ ๊ฒ์ ์๋๊ณ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋ ๋ชจ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด๋ณด๋ค ์ถ๊ฐ์ ์ธ ๋์์ด ์๋ ๊ฒ์ด์ฃ . ๊ฒ๋ณด๊ธฐ์๋ ๊ฐ์ฒด์ฒ๋ผ ๋ณด์ด์ง๋ง (๊ฒ๋ณด๊ธฐ์ ๊ฐ์ฒด์ฒ๋ผ ๋ณด์ธ๋ค๋ ๊ฒ์ typeof๋ก ํ์ธํ์ ๋ 'object'๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋งํฉ๋๋ค)ํ๋กํผํฐ ์ ๊ทผ, ๊ธธ์ด ๋ณ๊ฒฝ, ํธ์ถ ๋ฐฉ์ ๋ฑ ์ผ๋ฐ ๊ฐ์ฒด์ ๋ค๋ฅธ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค. ๋ํ์ ์ธ ์์๋ Array, arguments, Function, Bound Function (bind๋ก ์์ฑ๋ ํจ์) ๋ฑ์ด ์์ต๋๋ค. ์๊น ์์์ ๋ดค๋ ๋ค์ด์ด๊ทธ๋จ ์ค์์ ํจ์ ๊ฐ์ฒด, ํน์ด ํจ์ ๊ฐ์ฒด๋ ๋ฐ๋ก ๋ค๋ฃฐ ํ ๋ ์ฐ์ ํน์ด ๊ฐ์ฒด์ ์ํ๋ Array์ ๋ํด์ ๋จผ์ ์์๋ณด๊ฒ ์ต๋๋ค.
Array๋ก ์์๋ณด๋ Exotic Object
Array๋ ๋๋ฌด ์ผ์์ ์ผ๋ก ์ฌ์ฉํ๋ค ๋ณด๋ ๋ฑํ โํน์ดํ๋คโ๊ณ ๋๊ปด์ง์ง ์์ต๋๋ค. ํ์ง๋ง ECMAScript ์คํ ๊ด์ ์์ ๋ณด๋ฉด, Array๋ ๋งค์ฐ ํน์ดํ ๊ฐ์ฒด์ ๋๋ค.
๊ทธ๋ผ Array๋ ์ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋๋ผ ํน์ด ๊ฐ์ฒด์ธ์ง, ์๋ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const arr = [];
arr[2] = 20;
console.log(arr.length); // 3
arr.length = 20;
console.log(arr); // (20) [empty ร 2, 20, empty ร 17]arr.length๋ฅผ 20์ผ๋ก ์ค์ ํ์ ๋ฟ์ธ๋ฐ, ๋ฐฐ์ด ์์ ์๋ ์์์ ์๊ฐ ๋์ด๋ฉ๋๋ค. ์ ๊ทธ๋ด๊น์?
๋ฐ๋ก ๋ฐฐ์ด์ length๋ ๋จ์ํ ์ซ์ ํ๋กํผํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฝ Array๊ฐ 'ํน์ด'ํ์ง ์์๋ค๋ฉด ๋จ์ํ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ ๊ฒ์
๋๋ค.
{
2: 20,
length: 20
}ํ์ง๋ง 'ํน์ด'ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค์ ๊ฐ์ ํ ๋นํ๋ฉด ์๋์ผ๋ก ์ฆ๊ฐํ๊ณ , length๋ฅผ ๋๋ ค๋ ์ค์ ์์๊ฐ ์ฑ์์ง์ง ์์ ์ฑ empty๋ก ๊ธธ์ด๋ง ๋์ด๋๋ ๋์์ด ๋ฐ์ํฉ๋๋ค.
์ด๋ Array๊ฐ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋ ๋ฐฐ์ด ์ ์ฉ ์คํ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋์์
๋๋ค. ECMAScript์ ์ ์๋ [[DefineOwnProperty]]์ ArraySetLength ๊ท์น์ ๊ธฐ์ค์ผ๋ก, ์ ์ฝ๋๊ฐ ์ ์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋์ง ๊ฐ๋จํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. arr[2] = 20
- "2"๋ ์ ํจํ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ผ์ 10.4.2.1์ 2๋ฒ ์คํ์ ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค.
- ์ด ์คํ์ ๋ฐ๋ผ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๊ฐ length ์ด์์ด๋ฉด length = index + 1๋ก ์๋ ์ฆ๊ฐํฉ๋๋ค.
- ๋ฐ๋ผ์
arr.length === 3์ด ๋ฉ๋๋ค.
2. arr.length = 20
Array๋ length์ ๊ฐ์ ํ ๋นํ๋ฉด 10.4.2.4์ 12๋ฒ ์คํ์ ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค.
- ๊ธธ์ด๊ฐ ๋์ด๋๋ฉด
- ์ค์ ์์๋ฅผ ์ฑ์ฐ์ง ์๊ณ
- ๋น ์ฌ๋กฏ(hole) ์ ์์ฑํ๋ค
์ด์ฒ๋ผ Array๋ ๊ฒ๋ณด๊ธฐ์ ํ๋ฒํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ๋ณ๋์ ๊ท์น์ ๋ฐ๋ฅด๋ Exotic Object์ ๋๋ค. ์ด์ ์ด ๊ฐ๋ ์ ํจ์์ ๊ทธ๋๋ก ์ ์ฉํด๋ณด๋ฉด, ์ฐ๋ฆฌ๊ฐ ํํ ์ฐ๋ ํจ์ ํธ์ถ๊ณผ bind๊ฐ ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋์ง ์ดํดํ ์ ์์ต๋๋ค.
Function Exotic Object
์๊น ์ ๋ค์ด์ด๊ทธ๋จ์์ ๋ณด์๋ฏ์ด ํน์ด ๊ฐ์ฒด ์์๋ Function ์ฆ ํจ์ ๊ฐ์ฒด๋ ์กด์ฌํฉ๋๋ค. ์๋ํ๋ฉด JavaScript์ ํจ์๋ ๋ด๋ถ์ ์ผ๋ก๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด์ฃ . ํ์ง๋ง ์ฌ๊ธฐ์ [[Call]] ๊ท์น์ด ์ถ๊ฐ๋ ๊ฐ์ฒด์
๋๋ค. ๋ฐ๋ผ์ ์ถ๊ฐ์ ์ธ ๋์์ด ์ ์๋์ด์๊ธฐ ๋๋ฌธ์ "ํน์ด"๊ฐ์ฒด์ธ ๊ฒ์
๋๋ค.
ํจ์ ๊ฐ์ฒด๋ ๋ชจ๋ ๋์์ ์ธ์ธํ ์ดํด๋ณด๊ธฐ ๋ณด๋ค๋ [[Call]]์ ์คํ์ ์์ฃผ๋ก ๋ณด๋ฉฐ bind์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ดํด๋ณผ๊ฑด๋ฐ์.
๊ทธ๋ผ Function์ [[Call]]๋ช
์ธ๋ฅผ ํ๋ฒ ์ดํด๋ณผ๊น์?
10.2.1-2๋ฒ ๋ช
์ธ๋ฅผ ๋ณด๋ฉด PrepareForOrdinaryCall ๋ด๋ถ ๋ก์ง์ด ์๋ก์ด ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ์ฝ์คํ์ ๋งจ ์์ Pushํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ 10.2.1-3๋ฒ์์ ๋ฐฉ๊ธ ์์ฑ๋ calleeContext๊ฐ ํ ์คํ ์ค์ธ ์ปจํ
์คํธ๊ฐ ๋์์์ ํ์ธํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ ๋ฆฌํ์๋ฉด, ์ผ๋ฐ ํจ์์ Call์ ์คํ ์ปจํ
์คํธ์ ์์ฑ์ ๋๋ฐํ๋ค๋ ๊ฒ์
๋๋ค.
Bind Exotic Object
์ด์ ํน์ด ํจ์ ๊ฐ์ฒด์ธ bind๋ฅผ ์ดํด๋ณผ ์ฐจ๋ก์
๋๋ค.
์ง๊ธ๊น์ง Object, Array, Function์ ์์๋๋ก ์ดํด๋ณธ ์ด์ ๋ ๊ฒฐ๊ตญ ์ด bind์ ๋์์ ์ดํดํ๊ธฐ ์ํจ์ด์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด bind๋ ์ผ๋ฐ ํจ์ ํธ์ถ๊ณผ ๋ฌด์์ด ๋ค๋ฅผ๊น์?
console.log ์ ํธ์์ ํต์ฌ์ด ๋๋ ์ง์ ์ bind์ [[Call]] ๋์์ด๊ธฐ ๋๋ฌธ์, ์ฌ๊ธฐ์๋ Function๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก [[Call]] ๋์์ ์ด์ ์ ๋ง์ถฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Theย [[Call]]ย internal method of aย bound function exotic objectย Fย takes argumentsย thisArgumentย (anย ECMAScript language value) andย argumentsListย (aย Listย ofย ECMAScript language values) and returns either aย normal completion containingย anย ECMAScript language valueย or aย throw completion. It performs the following steps when called:
- Letย targetย beย F.
[[BoundTargetFunction]]. - Letย boundThisย beย F.
[[BoundThis]]. - Letย boundArgsย beย F.
[[BoundArguments]]. - Letย argsย be theย list-concatenationย ofย boundArgsย andย argumentsList.
- Return ?ย Call(target,ย boundThis,ย args).
bind์ [[Call]]์ 10.2.1์ ํจ์ [[Call]]๊ณผ๋ ๋ค๋ฅธ ๋์์ ๋ณด์
๋๋ค. ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์ ์๊ณ , ๊ธฐ์กด์ ์ ์ฅํด๋ ์ ๋ณด๋ฅผ ๊บผ๋ด์ด ์ฌ์กฐํฉํ๋ ๊ณผ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
function add(a, b) {
return a + b;
}
const add10 = add.bind(null, 10);bind๊ฐ ํธ์ถ๋๋ฉด ECMAScript ์คํ 20.2.3.2์ 3๋ฒ ๊ท์น์ ๋ฐ๋ผ์ BoundFunctionCreate๊ฐ ์คํ๋๊ณ , Bound Function Exotic Object๊ฐ ์์ฑ๋๋ฉด์ ์๋์ ๊ฐ์ ์ ๋ณด๋ค์ด ์ ์ฅ๋ฉ๋๋ค.
add10.`[[BoundTargetFunction]]` === add
add10.`[[BoundThis]]` === null
add10.`[[BoundArguments]]` === [10]๊ทธ๋์ Call์ด ์คํ๋๋ฉด ์ด ์ ์ฅ๋ ์ ๋ณด๋ค์ ํ์ฉํด์ ํจ์๋ฅผ ๊ตฌ์ฑํ๊ณ Call์ ๋ฐํํด์ ์ ์ด๊ถ์ ๋๊น๋๋ค.
function vs bind
๊ทธ๋ผ ์คํ์์ผ๋ก ์ดํด๋ดค๋ functiond์ด๋ bind์ ์ค์ ๋์ ์ฐจ์ด๋ฅผ ์ง์ ๋ณผ๊น์? ์๋ ์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ์ฝ์์์ ์คํํ๊ณ , debugger๊ฐ ๋ฉ์ถ ์์ ์ callstack์ ์ด๋ค ๋ณํ๊ฐ ๋ฐ์ํ๋์ง ์ง์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const person = {
name: 'Gemini',
greet: function(message) {
debugger;
console.log(`${message}, ${this.name}!`);
}
};
// 1. ์ผ๋ฐ ํจ์ ํธ์ถ (10.2.1 `[[Call]]`)
console.log('%c--- ์ผ๋ฐ ํธ์ถ ์์ ---', 'color: blue; font-weight: bold');
person.greet('Hello');
// 2. ๋ฐ์ธ๋ ํจ์ ์์ฑ ๋ฐ ํธ์ถ (10.4.1.1 `[[Call]]`)
const boundGreet = person.greet.bind(person, 'Hi');
debugger
console.log('%c--- ๋ฐ์ธ๋ ํธ์ถ ์์ ---', 'color: green; font-weight: bold');
boundGreet();๋จผ์ 1๋ฒ ์ผ๋ฐ ํจ์๋ฅผ ํธ์ถํ ์์ ์ greet ๋ด๋ถ์์ debugger๋ฅผ ํตํด ๋ฉ์ถฐ๋ณด๋ฉด, callstack์ greet ํจ์๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ฒ boundGreet ๋ค์์ค์์ debugger๋ฅผ ์คํํด๋ณด๋ฉด bind์ฐ์ฐ์ ๋จ์ํ boundGreet์ bind target๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์ฝ์คํ์ ์ถ๊ฐ๋๋ ๊ฐ์ด ์๊ณ , greet ํจ์ ์์์ ์ฐํ debugger๋ฅผ ๋ณด๋ฉด callstack์ greet๋ง ์กด์ฌํ๊ณ , ๋ณ๋์ boundGreet๋ ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์๋ํ๋ฉด bind์ call์ ์๊ธฐ ์์ ์ ๋ํ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ์ง ์๊ณ , target function์ Call๋ก ์์ํ๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ฐ๋ผ์ target function์ ๊ธฐ์ค์ผ๋ก ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด์ฒ๋ผ bind๋ ์ค์ ๋ก ์ฝ์คํ์ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
๋ค์ log.ts๋ก ๋์์์
๊ทธ๋ผ ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ bind๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ํธ๋ ์ด์ค ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
- bind๋ ์ผ๋ฐ์ ์ธ JavaScript ๋ํผ ํจ์๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. ๋์ Bound Function Exotic Object๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด ๊ฐ์ฒด๋ ํธ์ถ ์ ์๋ก์ด JavaScript ์ฝ๋ ๋ ๋ฒจ์ ์๋ก์ด ์คํ ์ปจํ
์คํธ๋ฅผ ๋ง๋ค์ง ์๊ณ ๋ด๋ถ
[[Call]]์ถ์ ์ฐ์ฐ์ ํตํด ๊ณง๋ฐ๋ก ๋์ ํจ์(console.error ๋ฑ)๋ก ํธ์ถ์ ์์ํฉ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ DevTools์ ์คํ ํธ๋ ์ด์ค์๋ log.ts์ ๊ฐ์ ์ ํธ ๋ ์ด์ด๊ฐ ๋ผ์ด๋ค์ง ์์ต๋๋ค.
๋ฐ๋๋ก error: () => console.error(...) ์ฒ๋ผ ํ์ดํ ํจ์๋ ์ผ๋ฐ ํจ์๋ก ๊ฐ์ธ๋ฉด, ํด๋น ํจ์ ์์ฒด๊ฐ JS ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ฏ๋ก log.ts๊ฐ ์คํ ํธ๋ ์ด์ค์ ๋จ๊ฒ ๋ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์คํ ํธ๋ ์ด์ค๋ JavaScript ์คํ ์ปจํ
์คํธ(ํจ์ ํธ์ถ ํ๋ ์) ๋จ์๋ก ๊ตฌ์ฑ๋๋ฉฐ, ECMAScript ์คํ์ ์ถ์ ์ฐ์ฐ([[Call]] ๋ฑ) ์์ฒด๋ JS ์คํ ํ๋ ์์ด ์๋๊ธฐ ๋๋ฌธ์ ์ถ์ ๋์์ด ์๋๋๋ค.
๋ง๋ฌด๋ฆฌ
๋ง์ฝ bind์ ๋ด๋ถ ๋์์ ์์ง ๋ชปํ๋ค๋ฉด ์คํ ํธ๋ ์ด์ค๋ฅผ ์ถ์ ํด์ ๋๋ฒ์งธ ์คํ ํธ๋ ์ด์ค๋ก ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ก ๋์ฐ๋ ๋ฑ์ ํด๊ฒฐ์ฑ ์ ์ฌ์ฉํ์ ๊ฒ ๊ฐ์๋ฐ, ECMAScript ์คํ์ ๊ธฐ์ค์ผ๋ก ๋์์ ์ดํดํ๊ณ ๋๋ ๋ถํ์ํ ๋ณต์กํจ ์์ด ๊ฐ์ฅ ๊น๋ํ ํด๊ฒฐ์ฑ ์ ์ ํํ ์ ์์์ต๋๋ค. ์ด๋ ๊ฒ ๊ฐ๋จํด ๋ณด์ด๋ ์ ํธ์ด๋ผ๋ ๋ด๋ถ ๋์์ ์ ํํ ์ดํดํ๋ฉด ๋ ๋์ ์ค๊ณ๋ฅผ ํ ์ ์๋ค๋ ์ ์ ๋ค์ ํ ๋ฒ ๋๋ผ๊ฒ ๋์์ต๋๋ค.