Front-End/JavaScript

[Javascript] ์•Œ์“ธ์‹ ์žก(์•Œ์•„๋‘๋ฉด ์“ธ๋ชจ์žˆ๋Š” ์‹ ๊ธฐํ•œ ์žก์•„์Šคํฌ๋ฆฝํŠธ) - 2

Splin 2024. 11. 19.

๋‹ค์–‘ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„œ์ ๊ณผ ๊ธ€์„ ๋ณด๊ณ  ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์ง๋ฉดํ•˜๋ฉด์„œ ์ƒ์†Œํ•˜๊ฒŒ ๋А๋‚€ ๋ถ€๋ถ„๋“ค์„ ์ •๋ฆฌํ•ด๋…ผ ๊ธ€ ์ž…๋‹ˆ๋‹ค. (๋ชฉ์ฐจ๋ฅผ ๋ณด๊ณ  ๊ด€์‹ฌ์žˆ๋Š” ๋ถ€๋ถ€๋งŒ ์ฝ์–ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.)

๋‹จ์ˆœํžˆ ์ œ ์ฃผ๊ด€์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š” ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ด๋“œ๊ฐ€ ๋  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ ์ฃผ์˜ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐ŸŒŸ

 

 

1. ์Šค์ฝ”ํ”„(Scope)

์Šค์ฝ”ํ”„๋Š” ์ปจํ…์ŠคํŠธ๋Š” ๊ฐ’๊ณผ "ํ‘œํ˜„์‹"์ด "ํ‘œํ˜„"๋˜๊ฑฐ๋‚˜ ์ฐธ์กฐ ๋  ์ˆ˜ ์žˆ๋Š” ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ณ€์ˆ˜ ๋˜๋Š” ํ‘œํ˜„์‹์ด "ํ•ด๋‹น ์Šค์ฝ”ํ”„"๋‚ด์— ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

// ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ€์ด์Šค
function exampleFunction() {
  const x = "declared inside function"; // ๋ณ€์ˆ˜ x๋Š” ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  console.log("Inside function");
  console.log(x);
}

console.log(x); // ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ฌ๋ผ ์ ‘๊ทผ ๋ถˆ๊ฐ€

// ๊ฐ€๋Šฅํ•œ ์ผ€์ด์Šค
const x = "declared outside function";

exampleFunction();

function exampleFunction() {
  console.log("Inside function");
  console.log(x);
}

console.log("Outside function");
console.log(x); // ๊ฐ™์€ ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„์ด๋ฏ€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

 

2. ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(Lexical Scope)

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์„ ์–ธํ•˜์˜€๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ด๋ฅผ ์ •์  ์Šค์ฝ”ํ”„(Static Scope)๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

// ์˜ˆ์ œ 1
var x = 1;

function bar() {
	console.log(x);
}

// bar๋ฉ”์„œ๋“œ๊ฐ€ ์™ธ๋ถ€์˜ var x์™€ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— foo์•ˆ์—์„œ bar๋ฅผ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋กœ ์ธํ•˜์—ฌ ์™ธ๋ถ€ x๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
function foo() {
	var x = 10;
	bar();
}

foo(); // 1
bar(); // 1


// ์˜ˆ์ œ 2
var y = 2;

// fooy๊ฐ€ bary ๋‚ด๋ถ€์— ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— bary๊ฐ€ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ fooy๋Š” bary ๋‚ด๋ถ€์˜ y๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
function bary() {
  var y = 20;
  
  function fooy() {
  	console.log(y);
  }
  fooy();
}

bary();

์˜ˆ์ œ 2๋ฒˆ์€ ๋‹ค์Œ์˜ ํด๋กœ์ € ๊ฐœ๋…๊ณผ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์ด ๋ณด์‹œ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๋™์  ์Šค์ฝ”ํ”„(Dynamic Scope)
๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์™€ ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ•˜์˜€๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋™์  ์Šค์ฝ”ํ”„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
Bash Scripting, Common Lisp ๋“ฑ ์ผ๋ถ€ ์–ธ์–ด์—์„œ ๋™์  ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

 

 

3. ํด๋กœ์ €(Closure)

ํด๋กœ์ €๋Š” ๋ฐ˜ํ™˜๋œ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์„ ์–ธ๋์„ ๋•Œ์˜ ํ™˜๊ฒฝ(๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„)์ธ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ์ž์‹ ์ด ์„ ์–ธ๋์„ ๋•Œ์˜ ํ™˜๊ฒฝ(์Šค์ฝ”ํ”„) ๋ฐ–์—์„œ ํ˜ธ์ถœ๋˜์–ด๋„ ๊ทธ ํ™˜๊ฒฝ(์Šค์ฝ”ํ”„)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ž์‹ ์ด ์ƒ์„ฑ๋  ๋•Œ์˜ ํ™˜๊ฒฝ(๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„)์„ ๊ธฐ์–ตํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํด๋กœ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์€๋‹‰
  • ๋น„๋™๊ธฐ ์ž‘์—…
  • ๋ชจ๋“ˆ ํŒจํ„ด

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋‘ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

4. ์ปค๋ง(Currying)

์ปค๋ง์€ f(a, b, c)์ฒ˜๋Ÿผ ๋‹จ์ผ ํ˜ธ์ถœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ f(a)(b)(c)์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ์ธ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค๋กœ ํ˜ธ์ถœ๋œ ํ›„ ๋ณ‘ํ•ฉ๋˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

function curry(f) { // ์ปค๋ง ๋ณ€ํ™˜์„ ํ•˜๋Š” curry(f) ํ•จ์ˆ˜
  return function(a) {
    return function(b) {
      return f(a, b);
    };
  };
}

// usage
function sum(a, b) {
  return a + b;
}

let curriedSum = curry(sum);

alert( curriedSum(1)(2) ); // 3
alert( curry(sum)(1)(2) ); // ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ง์„ ์ด์šฉํ•ด log ํ•จ์ˆ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค์ค‘ ์ธ์ˆ˜(๋งค๊ฐœ๋ณ€์ˆ˜)๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์กฐ๊ธˆ ๋ณต์žกํ•œ ๊ณ ๊ธ‰ ์ปค๋ง์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ  ๋งํฌ

 

 

5. ์ผ๊ธ‰ ๊ฐ์ฒด, ์ผ๊ธ‰ ํ•จ์ˆ˜

์ผ๊ธ‰ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๊ธฐ, ์ˆ˜์ •ํ•˜๊ธฐ, ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๊ธฐ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ง€์›ํ•  ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ๊ธ‰ ๊ฐ์ฒด์ธ ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ํ•จ์ˆ˜๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜ MDN ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

6. reflow์™€ repaint

reflow๋Š” Dom์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” CSS(width, height, margin, padding ๋“ฑ..)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

repaint๋Š” ๋ ˆ์ด์•„์›ƒ์€ ๊ทธ๋Œ€๋กœ์ด๊ณ , ์ƒ‰์ƒ์ด๋‚˜ ๋ฐฐ๊ฒฝ ๋“ฑ์˜ ์Šคํƒ€์ผ๋งŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์— ์š”์†Œ์˜ ๋ชจ์–‘๋งŒ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, reflow๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๊ณ , repaint๋Š” ๊ทธ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

reflow, repaint๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

  1. reflow๋ฅผ ์œ ๋ฐœํ•˜๋Š” CSS ์†์„ฑ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”
  2. transform๊ณผ opacity ์†์„ฑ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”
  3. willchange ์†์„ฑ ์‚ฌ์šฉ

์ตœ์ ํ™” ๊ด€๋ จํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

7. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์˜ ํ™˜๊ฒฝ์„ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

  • ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์ปจํ…์ŠคํŠธ. ์ „์—ญ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํฌํ•จ
  • ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ : ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ์ปจํ…์ŠคํŠธ. ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • ๋ณ€์ˆ˜ ๊ฐ์ฒด
  • ์Šค์ฝ”ํ”„ ์ฒด์ธ
  • this

์„ธ๋ถ€ ์„ค๋ช…์€ ์•„๋ž˜ ๋งํฌ ์ฐธ๊ณ 

 

 

8. ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)

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

์ถœ์ฒ˜ : https://inpa.tistory.com/entry/%F0%9F%94%84-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84-%EA%B5%AC%EC%A1%B0-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC#%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98_%EB%82%B4%EB%B6%80_%EA%B5%AC%EC%84%B1%EB%8F%84

  • Call Stack : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
  • Heap : ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
  • Web APIs : ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณต๋˜๋Š” API ๋ชจ์Œ์œผ๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…๋“ค์„ ์ „๋‹ดํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ (Console API๋‚˜ Canvas API๋Š” Web API์ด์ง€๋งŒ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ Web APIs์™€ ๊ด€๋ จ์ด ์—†๊ณ  Call Stack์—์„œ๋™๊ธฐ์ ์œผ๋กœ ๋ฐ”๋กœ ์‹คํ–‰๋จ)
    • Timer : setTimeout, setInterval๊ฐ™์€ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ ์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด Macro Task Queue๋กœ ์ „๋‹ฌ
    • XMLHttpRequest : ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด(AJAX ๊ธฐ์ˆ ์˜ ํ•ต์‹ฌ) ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด Micro Task Queue๋กœ ์ „๋‹ฌ
    • DOM Event Handler : HTML ๋ฌธ์„œ์˜ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์„ ํ‘œํ˜„ํ•˜๊ณ  ์กฐ์ž‘. ์ด๋ฒคํŠธ ๊ฐ์ง€๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ, ์ด๋ฒคํŠธ ์‹คํ–‰์€ ํ•ญ์ƒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜์—ฌ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•จ
    • Web Workers : ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด Javascript์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ(๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—… ์ˆ˜ํ–‰)
    • ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์ž‘์—… : ๋ธŒ๋ผ์šฐ์ €๋‚˜ Node.js ํ™˜๊ฒฝ์—์„œ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘
    • Geolocation API : ์‚ฌ์šฉ์ž ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๋น„๋™๊ธฐ์  Web API๋กœ ๋ธŒ๋ผ์šฐ์ €๋Š” Geolocation ์š”์ฒญ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•œ ๋’ค, ๊ฒฐ๊ณผ๋ฅผ Macro Task Queue๋กœ ์ „๋‹ฌ
  • Callback Queue : ๋น„๋™๊ธฐ์  ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” ๊ณต๊ฐ„ (Call Stack์ด ๋น„์–ด์žˆ์„ ๋•Œ Micro, Macro ์ˆœ์œผ๋กœ Queue์— ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ Call Stack์œผ๋กœ ์˜ฎ๊ธฐ๊ฒŒ ๋จ)
    • Macro Task Queue(= Task Queue) : setTimeout, setInterval, fetch, addEventListner์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” Queue
    • Micro Task Queue : promise.then, process,nextTick, MutationObserver์™€ ๊ฐ™์ด ์šฐ์„ ์ ์œผ๋กœ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” Queue(์šฐ์„ ์ˆœ์œ„ ๋†’์Œ)
  • Animation Frames Queue : ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ž‘์—…์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•จ requestAnimationFrame ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ์„ ๋“ฑ๋กํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ repaint ์ง์ „์— ํ•ด๋‹น Queue์— ์žˆ๋Š” ์ž‘์—…์„ ์ „๋ถ€ ์ฒ˜๋ฆฌ

์˜ˆ์‹œ ์ฝ”๋“œ

console.log('Start!');

setTimeout(() => {
  console.log('Timeout!');
}, 0);

Promise.resolve('Promise!').then(res => console.log(res));

console.log('End!');

์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        1. Call Stack์— console.log('Start!'); ์ด ์Œ“์ธ ๋’ค ์ถœ๋ ฅ
        2. setTimeout ์ฝ”๋“œ๊ฐ€ ์ฝœ ์Šคํƒ์— ์ ์žฌ๋˜๊ณ  ์‹คํ–‰๋˜๋ฉด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด Web API๋กœ ์˜ฎ๊ฒจ์ง€๊ณ  ํƒ€์ด๋จธ ์ž‘๋™(0์ดˆ๋ผ์„œ ์‚ฌ์‹ค์ƒ ๋ฐ”๋กœ ์ข…๋ฃŒ)
        3. ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ ํ›„ setTimeout ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” Macro Task Queue์— ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ ์žฌ
        4. Promise ์ฝ”๋“œ๊ฐ€ Call Stack์— ์ ์žฌ ๋˜์–ด ์‹คํ–‰๋˜๊ณ  then ํ•ธ๋“ค๋Ÿฌ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด MicroTask Queue์— ์ ์žฌ
        5. console.log('End!') ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ถœ๋ ฅ
        6. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด Call Stack์ด ๋น„์›Œ์ง€๊ฒŒ ๋จ
        7. ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ Callback Queue(Macro/Micro Task Queue)์— ๋‚จ์•„์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ Call Stack์— ์ ์žฌ (์ด ๋•Œ, Micro Task Queue์— ๋‚จ์•„ ์žˆ๋Š” Callback์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌ)
        8. Micro Task Queue์— ์žˆ๋Š” console.log(res); ์ถœ๋ ฅ
        9. Macro Task Queue์— ์žˆ๋Š” console.log('Timeout!'); ์ถœ๋ ฅ

๋‹ค์Œ ์‚ฌ์ดํŠธ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์ง€ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ•œ ๋ฒˆ ํ…Œ์ŠคํŠธํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ ๋‹ค์Œ Article์— Node.js, Async/Await ๋™์ž‘ ๊ณผ์ • ๋“ฑ ๋‹ค์–‘ํ•œ ๋‚ด์šฉ๋“ค์ด ์žˆ์œผ๋‹ˆ ํ•œ ๋ฒˆ ๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

9. ์ธํ„ฐ๋„ท ์ฐฝ์— www.google.com์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ? 

์‚ฌ์šฉ์ž๊ฐ€ www.google.com์„ ์ฃผ์†Œ์ฐฝ์— ์ž…๋ ฅํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. DNS ์กฐํšŒ : ๋„๋ฉ”์ธ ์ด๋ฆ„์„ IP์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…. ์บ์‹œ๋œ DNS ๊ธฐ๋ก์„ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด ๋กœ์ปฌ DNS ์„œ๋ฒ„์— ์š”์ฒญํ•˜์—ฌ www.google.com์— ํ•ด๋‹นํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  2. TCP ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ : IP ์ฃผ์†Œ๊ฐ€ ํ™•์ธ๋˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์™€ TCP์—ฐ๊ฒฐ์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3-way-handshake๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. HTTP ์š”์ฒญ : TCP ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP ๋˜๋Š” HTTPS ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด ์š”์ฒญ์€ GET / HTTP / 1.1 ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์›นํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ์€ ๋ฉ”์„ธ์ง€์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ€ ์•”ํ˜ธํ™”๋œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์•ˆ ์ธ์ฆ์„œ๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ํ˜‘์ƒํ•ฉ๋‹ˆ๋‹ค. (HTTPS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ SSL/TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋„ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.)
  4. ์„œ๋ฒ„์˜ ์‘๋‹ต : ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ๋ฐ›์•„ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค(HTML, CSS ,JavaScript, ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด ์‘๋‹ต์€ HTTP ์‘๋‹ต ์ฝ”๋“œ(ex. 200 OK)์™€ ํ•จ๊ป˜ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  5. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํŒŒ์ดํ”„ ๋ผ์ธ : ๋ฐ›์€ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. DOM๊ณผ CSSOM์„ ์ƒ์„ฑํ•˜๊ณ , ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ ๋’ค, ๋ ˆ์ด์•„์›ƒ ํŽ˜์ธํŠธ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์œ• ํŽ˜์ด์ง€๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

 

 

10. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ํŽ˜์ด์ง€๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ฑฐ์น˜๋Š” 5๊ฐ€์ง€ ๊ณผ์ •์„ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

1. DOM(Document Object Model) ์ƒ์„ฑ

  1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ํŒŒ์ผ ๋ฐ›์Œ
  2. ํŒŒ์ผ์„ Byte๋‹จ์œ„๋กœ ์ฝ์Œ
  3. ๋ธŒ๋ผ์šฐ์ €์˜ HTML Parser๊ฐ€ ๋ฐ”์ดํŠธ๋“ค์„ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
  4. ๋ฌธ์ž๋“ค์„ ๋‹ค์‹œ HTML ํ† ํฐ(ํƒœ๊ทธ, ํ…์ŠคํŠธ, ์†์†ก ๋“ฑ์„ ์˜๋ฏธ) ์œผ๋กœ ๋ณ€ํ™˜
  5. ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ DOM ํŠธ๋ฆฌ ์ƒ์„ฑ

2. CSSOM(CSS Object Model) ์ƒ์„ฑ

  1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CSS ํŒŒ์ผ Parser๊ฐ€ ๋ฐ”์ดํŠธ๋“ค์„ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
  2. CSS ๊ทœ์น™์— ์˜ํ•˜์—ฌ ์„ ํƒ์ž(selector : ์Šคํƒ€์ผ์„ ์ ์šฉํ•  HTML ์š”์†Œ)์™€ ์„ ์–ธ(declaration : ์ ์šฉํ•  ์Šคํƒ€์ผ)์œผ๋กœ ๋‚˜๋ˆ”
  3. CSS ๊ทœ์น™ ๊ธฐ๋ฐ˜์œผ๋กœ CSSOM ํŠธ๋ฆฌ ์ƒ์„ฑ

3. ๋ Œ๋” ํŠธ๋ฆฌ(Render Tree) ์ƒ์„ฑ

  • ๋ธŒ๋ผ์šฐ์ €๋Š” DOM๊ณผ CSSOM์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ
  • ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ํ™”๋ฉด์— ์‹ค์ œ๋กœ ํ‘œ์‹œ๋  ์š”์†Œ๋“ค๋กœ๋งŒ ๊ตฌ์„ฑ (ex. display: none ์†์„ฑ์ด ์žˆ๋Š” ์š”์†Œ๋Š” ํฌํ•จ X)
  • ๋ Œ๋” ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๋Š” DOM ํŠธ๋ฆฌ์˜ ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋˜๋ฉฐ, CSSOM ํŠธ๋ฆฌ์—์„œ ํ•ด๋‹น ์š”์†Œ์— ์ ์šฉ๋œ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ํฌํ•จ

4. ๋ ˆ์ด์•„์›ƒ(Layout)

  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ƒ์„ฑ๋œ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ์š”์†Œ์˜ ์ •ํ™•ํ™˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐ
  • ๋ทฐํฌํŠธ(viewport)์™€ ๊ฐ™์€ ํฌ๊ธฐ ์ •๋ณด์— ์˜์กด (ex. ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ ˆ์ด์•„์›ƒ ๊ณผ์ •์„ ๋‹ค์‹œ ์ˆ˜ํ–‰)
  • ๋ ˆ์ด์•„์›ƒ ๊ณผ์ •์—์„œ ๋…ธ๋“œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ๋ฆฌํ”Œ๋กœ์šฐ(reflow)๋ผ๊ณ  ํ•จ (๋ฆฌํ”Œ๋กœ์šฐ๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”)

5. ํŽ˜์ธํŠธ(Paint)

  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ฐ ์š”์†Œ๋ฅผ ์‹ค์ œ๋กœ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ์‹œ์ž‘
  • ํ…์ŠคํŠธ, ์ƒ‰์ƒ, ๊ทธ๋ฆผ์ž, ์ด๋ฏธ์ง€ ๋“ฑ ๋ชจ๋“  ์‹œ๊ฐ์  ์š”์†Œ๊ฐ€ ํ™”๋ฉด์— ๊ทธ๋ ค์ง
  • ํŽ˜์ธํŠธ ๊ณผ์ •์—์„œ ๊ฐ ์š”์†Œ๋ฅผ ํ™”๋ฉด์— ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋ฆฌํŽ˜์ธํŠธ(repaint)๋ผ๊ณ  ํ•จ (๋ฆฌํŽ˜์ธํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”)

6. ํ•ฉ์„ฑ(Compositing)

  • ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์— ๊ทธ๋ ค์งˆ ์š”์†Œ๋“ค์„ ๊ฐ๊ฐ์˜ ๋ ˆ์ด์–ด(layer)๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด ๋ ˆ์ด์–ด๋“ค์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข… ํ™”๋ฉด์„ ๊ตฌ์„ฑ
  • transform๊ณผ opacity์™€ ๊ฐ™์€ ์†์„ฑ์€ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ํŽ˜์ธํŠธ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ , ํ•ฉ์„ฑ ๋‹จ๊ณ„์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ
  • ํ•ฉ์„ฑ ๊ณผ์ •์—์„œ๋Š” GPU๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ๋ ˆ์ด์–ด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ฉ์„ฑํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋ดค์„ ๋•Œ๋Š” ๋น„์‹ผ ์ž‘์—…์ด๋ฏ€๋กœ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•จ

 

 

11. ํ˜ธ์ด์ŠคํŒ…(Hoisting)

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

ํ˜ธ์ด์ŠคํŒ…์˜ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. ์„ ์–ธ๋งŒ ํ˜ธ์ด์ŠคํŒ…ํ•  ๋ฟ, ๋ณ€์ˆ˜ ๊ฐ’ ํ• ๋‹น๊นŒ์ง€ ๋Œ์–ด์˜ฌ๋ฆฌ์ง€ ์•Š์Œ

console.log(myVar); // ๋ณ€์ˆ˜ ์ž์ฒด๋Š” ํ˜ธ์ด์ŠคํŒ…๋˜์ง€๋งŒ ์ดˆ๊ธฐํ™” ์ „๊นŒ์ง„ undefined

var myVar = 10;
console.log(myVar); // 10

 

2. ํ•จ์ˆ˜ ์„ ์–ธ์€ ์ „์ฒด๊ฐ€ ํ˜ธ์ด์ŠคํŒ…, ์„ ์–ธ ์ด์ „์— ํ˜ธ์ถœ ๊ฐ€๋Šฅ

console.log(myFunction()); // 'Hello World' ์ถœ๋ ฅ

function myFunction() {
  return 'Hello World';
}

 

3. TDZ(Temporal Dead Zone)

๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

ES6์— ๋„์ž…๋œ let๊ณผ const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” TDZ๊ฐ€ ์กด์žฌํ•˜์—ฌ, ์ด ๊ตฌ๊ฐ„์—์„œ๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

console.log(myLet); // TDZ๋กœ ์ธํ•ด ์ดˆ๊ธฐํ™” ์ „ ์ ‘๊ทผํ•˜๋ฉด ReferenceError ๋ฐœ์ƒ

let myLet = 10;

 

 

12. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์˜ ํŠน์ง•

1. ์ผ๊ธ‰ ๊ฐ์ฒด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ๊ฐ’์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const sayHello = function() { return 'Hello'; }; // ๋ณ€์ˆ˜์— ํ• ๋‹น
console.log(sayHello()); // 'Hello'

const executeFunction = function(fn) { // ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  return fn();
};
console.log(executeFunction(sayHello)); // 'Hello'

 

2. ์ต๋ช…ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ํ‘œํ˜„์‹

์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜, ์ฆ‰ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ต๋ช… ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ํ•จ์ˆ˜์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

const add = function(a, b) { // ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์„ ์–ธ
  return a + b;
};
console.log(add(2, 3)); // 5

 

3. ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ์‹์„ ํ†ตํ•ด ์„ ์–ธํ•œ ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ํ•จ์ˆ˜ ์„ ์–ธ ์ด์ „์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ํ›„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ์ฝ”๋“œ ์ƒ ์„ ์–ธ ์ด์ „์— ํ˜ธ์ถœ ๊ฐ€๋Šฅ
console.log(declaredFunction()); // 'Declared Function'
function declaredFunction() {
  return 'Declared Function';
}

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ• ๋‹น ํ›„์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
const expressedFunction = function() {
  return 'Expressed Function';
};
console.log(expressedFunction()); // 'Expressed Function'

 

4. ํด๋กœ์ €

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์„ ์–ธ๋œ ํ™˜๊ฒฝ(์Šค์ฝ”ํ”„) ์„ ๊ธฐ์–ตํ•˜๊ณ , ํ•ด๋‹น ํ™˜๊ฒฝ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋œ ๋‹น์‹œ ์Šค์ฝ”ํ”„ ๋‚ด์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๊ธ€ 3๋ฒˆ์˜ ํด๋กœ์ €๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

function outer() {
  const outerVar = 'I am outer!';
  
  return function inner() {
    return outerVar; // ํ•ด๋‹น ํ•จ์ˆ˜ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  };
}

const innerFunction = outer();
console.log(innerFunction()); // 'I am outer!'

 

5. ๊ณ ์ฐจ ํ•จ์ˆ˜ (HOF : Higher Order Function)

๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด๊ณ  ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์–ธ๋œป ๋ณด๋ฉด ํด๋กœ์ €์™€ ๋น„์Šทํ•ด ๋ณด์ด๋Š”๋ฐ, ํด๋กœ์ €์™€ ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํด๋กœ์ € : ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์„ ์–ธ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘š
  • ๊ณ ์ฐจ ํ•จ์ˆ˜ : ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘š
function multiplyBy(factor) {
  return function(num) { // ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Œ
    return num * factor;
  };
}

const double = multiplyBy(2);
console.log(double(5)); // 10

 

6. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow Function)

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ๋” ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

this ๋ฐ”์ธ๋”ฉ์—์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์„ ์–ธ๋œ ์œ„์น˜์˜ this ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ ๋ณ„๋„๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

this์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ๋ฐ”๋กœ ์•„๋ž˜์˜ ๊ธ€์„ ํ™•์ธํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค
const obj = {
  value: 42,
  method: function() {
    setTimeout(() => {
      console.log(this.value); // 42 (Arrow ํ•จ์ˆ˜๋Š” obj์˜ this๋ฅผ ์œ ์ง€)
    }, 1000);
    
//    setTimeout(function() {
//      console.log(this.value); // undefined (์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this๋Š” window๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋จ)
//    }, 1000);
  }
};
obj.method();

 


์ฐธ๊ณ  ๋งํฌ

 

๋Œ“๊ธ€