๐ŸŽ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฒคํŠธ

thumb_hyeokยท2022๋…„ 4์›” 11์ผ
0

๐ŸŸกย JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
10/15
post-thumbnail

๐Ÿค” ์ด๋ฒคํŠธ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

๋ธŒ๋ผ์šฐ์ €๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํŠน์ • ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๋งŒ์•ฝ ์ด ๋•Œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ•˜์—ฌ ์–ด๋–ค ์ผ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋  ํ•จ์ˆ˜๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์•Œ๋ ค ํ˜ธ์ถœ์„ ์œ„์ž„ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›ํ•˜๋Š” ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ฅ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋  ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(event handler)๋ผ ํ•œ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ˜ธ์ถœ์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์„ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก์ด๋ผ ํ•œ๋‹ค.์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ๋Š” ํ•จ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์•ผํ•œ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ ๋“ฑ์˜ ๋ฌธ์„ ํ• ๋‹นํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค. ์ด๋•Œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์œผ๋กœ ๋“ฑ๋ก๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ์€ ์‚ฌ์‹ค ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ•จ์ˆ˜ ๋ชธ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ์‹์€ HTML๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ˜ผ์žฌํ•จ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

<button onClick='sayHi('Lee')'>click me!</button>

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹

DOM ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ํ•จ์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹๋„ ๊ฒฐ๊ตญ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ๋กœ ๋ณ€ํ™˜๋˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ์— ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

// $button = ์ด๋ฒคํŠธ ํƒ€๊นƒ
// onclick = on + ์ด๋ฒคํŠธ ํƒ€์ž…
// function = ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ

$button.onclick = function () {
	console.log('button click');
};

addEventListener ๋ฉ”์„œ๋“œ ๋ฐฉ์‹

DOM Level 2์—์„œ ๋„์ž…๋œ EventTarget.prototype.addEventListener ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ ๋‘ ๋ฐฉ์‹์€ DOM Level 0๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋˜ ๋ฐฉ์‹์ด๋‹ค. ์•ž์˜ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ addEventListener ๋ฉ”์„œ๋“œ์—๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.

addEventListener ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์€ ๋™์ผํ•œ HTML ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ๋™์ผํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋“ฑ๋ก๋œ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

$button.addEventListener('click', function () {
	console.log('button click');
});

๐Ÿ“ค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ œ๊ฑฐ

addEventListener ๋ฉ”์„œ๋“œ๋กœ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด EventTarget.prototype.removeEventListener ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. removeEventListener ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•œ ์ธ์ˆ˜๋Š” addEventListener ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•ด์•ผ๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— null์„ ํ• ๋‹นํ•œ๋‹ค.

$button.addEventListener('click', function foo() {
	console.log('button click');
});

// ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ foo๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.
$button.removeEventListener('click', foo);

๐Ÿ’ก ์ด๋ฒคํŠธ ๊ฐ์ฒด

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ์— ๊ด€๋ จํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค. ํด๋ฆญ ์ด๋ฒคํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด ๋งค๊ฐœ๋ณ€์ˆ˜ e์— ์•”๋ฌต์ ์œผ๋กœ ํ• ๋‹น๋œ๋‹ค.
์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•  ๋•Œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

$button.addEventListener('click', foo());

const foo = function (e) {
	console.log(e.target);
}

์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์œ„ ๊ทธ๋ฆผ์˜ Event, UIEvent, MouseEvent ๋“ฑ ๋ชจ๋‘๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋‹ค.

const e = new MouseEvent('click');
console.log(e);
// MouseEvent {isTrusted: false, screenX: 0, screenY: 0, clientX: 0, ...}
// MouseEvent ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ click ์ด๋ฒคํŠธ ํƒ€์ž…์˜ MouseEvent ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๋„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ๋”๋ถˆ์–ด ์ƒ์„ฑ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ผ์›์ด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, click ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” MouseEvent ํƒ€์ž…์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ผ์›์ด ๋œ๋‹ค.


์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ

Event ์ธํ„ฐํŽ˜์ด์Šค, ์ฆ‰ Event.prototype์— ์ •์˜๋˜์–ด ์žˆ๋Š” ์ด๋ฒคํŠธ ๊ด€๋ จ ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ์ƒ์†๋ฐ›๋Š” ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ๋‹ค. ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž. MouseEvent๋‚˜ KeyboradEvent ๋“ฑ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋“ค์€ ๊ฐ๊ฐ ์ด๋ฒคํŠธ์— ๋งž๋Š” ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์ง์ ‘ ์•Œ์•„๋ณด์ž.

๊ณตํ†ต ํ”„๋กœํผํ‹ฐ์„ค๋ช…ํƒ€์ž…
type์ด๋ฒคํŠธ ํƒ€์ž…string
target์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†ŒDOM ์š”์†Œ ๋…ธ๋“œ
currentTarget์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ DOM ์š”์†ŒDOM ์š”์†Œ ๋…ธ๋“œ
eventPhase์ด๋ฒคํŠธ ์ „ํŒŒ ๋‹จ๊ณ„number
bubbles์ด๋ฒคํŠธ๋ฅผ ๋ฒ„๋ธ”๋ง์œผ๋กœ ์ „ํŒŒํ•˜๋Š”์ง€ ์—ฌ๋ถ€boolean
cancelablepreventDefault ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์ง€ ์—ฌ๋ถ€boolean
defaultPreventedpreventDefault ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€boolean
isTrusted์‚ฌ์šฉ์ž์˜ ํ–‰์œ„์— ์˜ํ•ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์ธ์ง€ ์—ฌ๋ถ€boolean
timeStamp์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ(1970/01/01/00:00:0๋ถ€ํ„ฐ ๊ฒฝ๊ณผ ๋ฐ€๋ฆฌ์ดˆ)number

๐Ÿ›ฐ๏ธ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ์œ„์ž„

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ DOM ์š”์†Œ์ธ ์ด๋ฒคํŠธ ํƒ€๊ฒŸ์„ ์ค‘์‹ฌ์œผ๋กœ DOM ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋œ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ด๋ฒคํŠธ ํƒ€๊นƒ ๋˜๋Š” ์ „ํŒŒ๋œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•  DOM ๋…ธ๋“œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ/ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํƒ€๊นƒ ๋‹จ๊ณ„์™€ ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๋งŒ ์บ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ addEventListener ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋ชจ๋“  ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์บก์ฒ˜๋ง ๋‹จ๊ณ„(capturing phase): ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„ ์š”์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ
    (window โ†’ target ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ๋œ๋‹ค.)

  • ํƒ€๊นƒ ๋‹จ๊ณ„(target phase): ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํƒ€๊นƒ์— ๋„๋‹ฌ

  • ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„(bubbling phase): ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ์—์„œ ์ƒ์œ„ ์š”์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ
    (target โ†’ window ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ๋œ๋‹ค.)

์œ„์˜ ๋‹จ๊ณ„ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋œ๋‹ค. ์•„๋ž˜์—์„œ addEventListener๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•˜๋Š” ๊ฑธ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

// index.html
<ul id="crews">
	<li id="harry">Harry</li>
	<li id="vordt">Vordt</li>
</ul>

// index.js
// $crew ์š”์†Œ์˜ ํ•˜์œ„ ์š”์†Œ์ธ li ์š”์†Œ๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ ์บก์ฒ˜๋ง ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•œ๋‹ค.
// ์บก์ฒ˜๋ง ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•˜๋ ค๋ฉด 3๋ฒˆ์งธ ์ธ์ˆ˜๋กœ true๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.
$crews.addEventListener('click', e => {
	console.log(`์ด๋ฒคํŠธ ๋‹จ๊ณ„: ${e.eventPhase}`); // 1
	console.log(`์ด๋ฒคํŠธ ํƒ€๊นƒ: ${e.target}`); // [object HTMLLIElement]
	console.log(`ํ˜„์žฌ ํƒ€๊นƒ: ${e.currentTarget}`); // [object HTMLUListElement]
}, true);

// ํƒ€๊นƒ ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•œ๋‹ค.
$harry.addEventListener('click', e => {
	console.log(`์ด๋ฒคํŠธ ๋‹จ๊ณ„: ${e.eventPhase}`); // 2
	console.log(`์ด๋ฒคํŠธ ํƒ€๊นƒ: ${e.target}`); // [object HTMLLIElement]
	console.log(`ํ˜„์žฌ ํƒ€๊นƒ: ${e.currentTarget}`); // [object HTMLLIElement]
});

// ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•œ๋‹ค.
$crews.addEventListener('click', e => {
	console.log(`์ด๋ฒคํŠธ ๋‹จ๊ณ„: ${e.eventPhase}`); // 3
	console.log(`์ด๋ฒคํŠธ ํƒ€๊นƒ: ${e.target}`); // [object HTMLLIElement]
	console.log(`ํ˜„์žฌ ํƒ€๊นƒ: ${e.currentTarget}`); // [object HTMLUListElement]
});

์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์œ„ DOM์š”์†Œ์— ์œ„์ž„ํ•ด์„œ ์œ ์šฉํ•˜๊ฒŒ ์จ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ ์œ„์ž„(event delegation)์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ DOM ์š”์†Œ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ ์ƒ์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. ์ด๋ฒคํŠธ ์œ„์ž„์„ ํ†ตํ•ด ์ƒ์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

<ul id="crews">
	<li id="harry">Harry</li>
	<li id="vordt">Vordt</li>
</ul>

๋งŒ์•ฝ ์ด ์ฝ”๋“œ์—์„œ ul ์ด ์•„๋‹Œ li ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋ฒคํŠธ ์œ„์ž„์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, li ๋งˆ๋‹ค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์ด๋ฒคํŠธ ์œ„์ž„์„ ํ™œ์šฉํ•˜๋ฉด ul ์—๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๊ณ , ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์ด๋ฒคํŠธ ํƒ€๊นƒ์ด li ์ผ ๋•Œ๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋ง‰์•„์ฃผ๋ฉด ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

$crews.addEventListener('click', handleClickLi());

const handleClickLi = function (e) {
	if (!e.target.matches('#crews > li') {
		return;
	}
	...
} 

๐Ÿ“ฉ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€ this

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ฐฉ์‹

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์€ ์‚ฌ์‹ค ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋ฌธ์ด๋ผ๊ณ  ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ handleClick ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

๋‹จ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด ๋•Œ handleClick์— ์ „๋‹ฌํ•œ this๋Š” ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋‹ค.

// index.html
<button onClick="handleClick(this)"></button>

// index.js
const handleClick(button) {
	console.log(button); // ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ
	console.log(this); // window
}

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹, addEventListener ๋ฉ”์„œ๋“œ ๋ฐฉ์‹

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹๊ณผ addEventListener ๋ฉ”์„œ๋“œ ๋ฐฉ์‹ ๋ชจ๋‘ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค

$harry.onClick = function (e) {
	console.log(this); // ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ
}

$harry.addEventListener('click', handleClick());

const handleClick() {
	console.log(this); // ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ DOM ์š”์†Œ
}

๐Ÿ“ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์ƒ์„ฑ

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ ํƒ€์ž…์ด ๊ฒฐ์ •๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑํ•œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ž„์˜์˜ ์ด๋ฒคํŠธ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„๋กœ ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ผ ํ•œ๋‹ค.

const keyboardEvent = new keyboardEvent('keyup');
console.log(keyboradEvent.type); // keyup

const customEvent = new CustomEvent('foo');
console.log(customEvent.type); // foo 

์ƒ์„ฑ๋œ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ bubbles์™€ cancelable ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด false๋กœ ๊ธฐ๋ณธ ์„ค์ •๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ํ”„๋กœํผํ‹ฐ ์ง€์ • ๊ฐ’์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

const customEvent = new MouseEvent('click', {
	bubbles: true,
	cancelable: true
	// ์ด์™ธ์—๋„ ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ๊ณ ์œ ์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
});

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋Š” isTrusted ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ์–ธ์ œ๋‚˜ false์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉ์ž์˜ ํ–‰์œ„์— ์˜ํ•ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ isTrusted ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ ์–ธ์ œ๋‚˜ true๋‹ค.


์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜

์ƒ์„ฑ๋œ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋Š” dispatchEvent ๋ฉ”์„œ๋“œ๋กœ ๋””์ŠคํŒจ์น˜(์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ–‰์œ„)ํ•  ์ˆ˜ ์žˆ๋‹ค. dispatchEvent ๋ฉ”์„œ๋“œ์— ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ dispatchEvent ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. dispatchEvent ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ์— ๋ฐ”์ธ๋”ฉ๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— dispatchEvent ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ด์ „์— ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์•ผํ•œ๋‹ค.

const $button = document.querySelector('#harry');
const $button2 = document.querySelector('#vordt');
const customEvent = new MouseEvent('click');
const customEvent2 = new CustomEvent('foo', {
  detail: { message: 'Hello' },
});

$button.addEventListener('click', e => {
  console.log(e);
  alert(`${e} Clicked!`);
});
$button2.addEventListener('foo', e => {
  alert(e.detail.message);
});

$button.dispatchEvent(customEvent);
$button2.dispatchEvent(customEvent2);

โžฟ ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ํƒœ์Šคํฌ ํ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด๋ฉด ๋งŽ์€ ํƒœ์Šคํฌ๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค. HTML ์š”์†Œ๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ํ†ตํ•ด ์›€์ง์ด๋ฉด์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•˜๊ณ , HTTP ์š”์ฒญ์„ ํ†ตํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด์„œ ๋ Œ๋”๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์‹œ์„ฑ(concurrency)์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„(event loop)๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ฝœ ์Šคํƒ์— ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ณด๊ด€๋˜๋Š” ํƒœ์Šคํฌ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ๋ฐ˜๋ณตํ•ด์„œ ํ™•์ธํ•œ๋‹ค.
๋งŒ์•ฝ ์ฝœ ์Šคํƒ์ด ๋น„์–ด ์žˆ๊ณ  ํƒœ์Šคํฌ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ํƒœ์Šคํฌ ํ์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ ์ฝœ ์Šคํƒ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

์„ค๋ช…๋งŒ์œผ๋กœ๋Š” ์ดํ•ด๊ฐ€ ํž˜๋“œ๋‹ˆ ์˜ˆ์‹œ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณด๋ฉด์„œ ์‚ดํŽด๋ณด์ž.

const foo = function () {
	console.log('foo');
}

const bar = function () {
	console.log('bar');
}

setTimeout(foo, 0);
bar();
  1. ์ „์—ญ ์ฝ”๋“œ๊ฐ€ ํ‰๊ฐ€๋˜์–ด ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ฝœ ์Šคํƒ์— ํ‘ธ์‹œ๋œ๋‹ค.

  2. ์ „์—ญ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด setTimeout ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. setTimeout ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ฝœ ์Šคํƒ์— ํ‘ธ์‹œ๋œ๋‹ค.

  3. setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์Šค์ผ€์ค„๋งํ•˜๊ณ  ์ข…๋ฃŒ๋˜์–ด ์ฝœ ์Šคํƒ์—์„œ ํŒ๋œ๋‹ค. ์ด๋•Œ ํ˜ธ์ถœ ์Šค์ผ€์ค„๋ง, ์ฆ‰ ํƒ€์ด๋จธ ์„ค์ •๊ณผ ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํƒœ์Šคํฌ ํ์— ํ‘ธ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์—ญํ• ์ด๋‹ค.

  4. ๋ธŒ๋ผ์šฐ์ €๋Š” ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ํƒ€์ด๋จธ์˜ ๋งŒ๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ foo๊ฐ€ ํƒœ์Šคํฌ ํ์— ํ‘ธ์‹œ๋œ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ foo๋Š” ํƒ€์ด๋จธ๊ฐ€ ๋๋‚˜๋„ ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ฝœ ์Šคํƒ์ด ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ํƒœ์Šคํฌ ํ์—์„œ ๋Œ€๊ธฐํ•œ๋‹ค.

  5. bar ํ•จ์ˆ˜์˜ ์‹คํ–‰๊นŒ์ง€ ๋๋‚˜๊ณ  ์ „์—ญ ์ฝ”๋“œ ์‹คํ–‰์ด ๋๋‚˜๊ณ  ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ํŒ๋˜๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ฝœ ์Šคํƒ์ด ๋น„์–ด ์žˆ์Œ์ด ๊ฐ์ง€๋˜๊ณ  ํƒœ์Šคํฌ ํ์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ foo๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ฝœ ์Šคํƒ์— ํ‘ธ์‹œ๋œ๋‹ค.


๐Ÿง ์ •๋ฆฌ

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ์›ํ•˜๋Š” ๋™์ž‘์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ์œ„์ž„์„ ํ™œ์šฉํ•ด ํŠน์ • ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์œ„, ํ•˜์œ„ ์š”์†Œ์—์„œ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ™œ์šฉํ•ด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

  • ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive
      1. ์ด๋ฒคํŠธ (754p~797p)
      1. ํƒ€์ด๋จธ (800p~806p)
      1. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (809p~812p)
profile
์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 4๊ธฐ ์›น ํ”„๋ก ํŠธ์—”๋“œ

0๊ฐœ์˜ ๋Œ“๊ธ€