๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ‘‰ JavaScript

  1. ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠœํ† ๋ฆฌ์–ผ
  2. ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

๐ŸŽˆ const์™€ var์˜ ์ฐจ์ด์ ์€?โ€‹

var์€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ , let์ด๋‚˜ const๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์ฝ”๋“œ ๋ธ”๋ก๋‚ด์• ์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
var์€ ๋ณ€์ˆ˜ ์„ ์–ธ ์ „์— ์ฐธ์กฐํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ณ  undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, let์€ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ „์— ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ฉด Reference Error๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ด€์ ์—์„œ ๋ณด์ž๋ฉด var์€ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ณผ์ •์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ, ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋ณ€์ˆ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋กํ•  ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ ํ›„ undefined ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ๊ฑฐ์ณค๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ ์ด์ „์— ์ฐธ์กฐํ•ด๋„ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. let์€ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ๊ณผ์ •์ด ๋”ฐ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•  ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์„ ๋งŒ๋‚œ ๊ทธ ์‹œ์ ์— ์ดˆ๊ธฐํ™” ๊ณผ์ •์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ์ฐธ์กฐํ•˜๋ฉด ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์„ ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ „๊นŒ์ง€์˜ ๊ณต๊ฐ„์„ TDZ(์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
let๊ณผ var์€ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ const๋Š” ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— const๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ• ๋‹น์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : https://poiemaweb.com/es6-block-scope

๐ŸŽˆ ํ˜ธ์ด์ŠคํŒ…์ด๋ž€โ€‹

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ๊ฐœ๋…์ž์ฒด๋Š” ์ฝ”๋“œ ํ•ด์„์„ ์ข€ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค๋ผ๊ณ  ํ•ด์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๊ณผ ๊ฐ’ ํ• ๋‹น์ด ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„ ๋ฌธ์žฅ์€ ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ… ๋˜๊ณ , ํ• ๋‹น๋ฌธ์€ ๊ทธ์ž๋ฆฌ์— ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•จ์ˆ˜์˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์ฐจ์ด์ ์ด ์žˆ๋Š”๋ฐ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜์ž์ฒด ํ†ต์ฒด๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ฒŒ๋˜๊ณ , ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ… ๋ฉ๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ES6์— ๋„์ž…๋œ let, const๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์„ ์–ธ์„ ํ˜ธ์ด์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.

// ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…
function test1() {
console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ');
}

// ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…
// var test2 = undefined;
var test2 = function() {
console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹');
}

๐ŸŽˆ ์‹คํ–‰ ์ปจํ…์ŠคํŠธโ€‹

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

VariableEnvironment์™€ LexicalEnvironment๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ช…, ๋ณ€์ˆ˜์˜ ์‹๋ณ„์ž, ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜๋ช… ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” environmentRecord์™€ ๋ฐ”๋กœ ์ง์ „ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜๋Š” outerEnvironmentReference๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

outerEnvironmentReference๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ ๋งŒ์•ฝ LexicalEnvironment์— ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ๋Š” LexicalEnvironment์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋งŒ์•ฝ ์—†์„ ๊ฒฝ์šฐ์—๋Š” outerEnvironmentReference์— ๋‹ด๊ธด ๋ฐ”๋กœ ์ง์ „ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๊นŒ์ง€๋„ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

thisBinding์€ this๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š”๋ฐ, ๋งŒ์•ฝ this๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” this๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๊ณ , ๊ทธ ์™ธ์—๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ this์— ์ €์žฅ๋˜๋Š” ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ฐธ๊ณ : https://saseungmin.github.io/summary_of_technical_books/docs/javascript/core-javascript/chapter-2

๐ŸŽˆ thisโ€‹

this๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— this์˜ ์ƒ์„ฑ๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฒฐ์ •๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— this๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ผ๋‹จ, ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window, node.js์—์„œ๋Š” global์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ๋ฉ”์†Œ๋“œ๋กœ์จ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ์‹œํ‚จ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ, ๋ฉ”์„œ๋“œ ๋ช…์˜ ๋ฐ”๋กœ ์•ž์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

var obj = {
methodA: function() { console.log(this); },
inner: {
methodB: function() { console.log(this); },
},
};

obj.methodA(); // { methodA: f, inner: {...} } ( === obj)
obj.inner.methodB(); // { methodB: f } ( === obj.inner)

์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ๋Š” this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ๋„ this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ณด์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ self์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— this๋ฅผ self๋กœ ํ• ๋‹น ํ•œ ๋’ค ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š” ํ™”์‚ดํ‘œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉ์‹œ์ผœ์ฃผ๋Š” call apply bind๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ์ •์˜ํ•œ๋ฐ”์— ๋”ฐ๋ฅด๋ฉฐ, ๋งŒ์•ฝ ์ •์˜๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž์—์„œ์˜ this๋Š” ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š”๋ฐ apply์™€ call์€ ๋‘˜์˜ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์ฐจ์ด๋Š” ์—†์ง€๋งŒ, apply๋Š” ์ธ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›๋Š” ๋ฐ˜๋ฉด, call์€ ์ธ์ž ๋ชฉ๋ก์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
ES5์— ๋‚˜์˜จ bind๋Š” call๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ฐจ์ด์ ์€ call์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ, bind๋Š” ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ bind์˜ ๊ธฐ๋Šฅ ๋•๋ถ„์— this๋ฅผ ๋ฏธ๋ฆฌ ์ ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋ถ€๋ถ„ํ•จ์ˆ˜์ ์šฉํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ชฉ์ ์„ ์ง€๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  bind๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ ๋งŒ๋“  ํ•จ์ˆ˜๋Š” name ํ”„๋กœํผํ‹ฐ์— bound๋ผ๋Š” bind์˜ ์ˆ˜๋™ํƒœ ์ ‘๋‘์–ด๊ฐ€ ๋ถ™๊ธฐ ๋•Œ๋ฌธ์—, call์ด๋‚˜ apply๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๋Š”๋ฐ ๋” ์ˆ˜์›”ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : https://saseungmin.github.io/summary_of_technical_books/docs/javascript/core-javascript/chapter-3

๐ŸŽˆ ํด๋กœ์ €โ€‹

function outer() {
var k = 1;

function inner() {
console.log(k);
}

return inner;
}

var func = outer();
func(); // 1;

ํด๋กœ์ €๋ž€ ์–ด๋–ค ํ•จ์ˆ˜ A์˜ ๋ณ€์ˆ˜ k๊ฐ€ ์กด์žฌํ• ๋•Œ k๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜ B๊ฐ€ ์™ธ๋ถ€๋กœ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ A์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ์™ธ๋ถ€ ํ•จ์ˆ˜ A์˜ ๋ณ€์ˆ˜ k๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ˜„์ƒ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

inner ํ•จ์ˆ˜์—์„œ outer์˜ ๋ณ€์ˆ˜ k์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ด€์ ์—์„œ ์„ค๋ช…ํ•˜๋ฉด inner ํ•จ์ˆ˜๋‚ด์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” k ์‹๋ณ„์ž๋ฅผ inner์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•ด์„œ k์˜ ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์ง์ „ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ๋Š” inner์˜ outerEnvironmentReference์—์„œ ๋ณ€์ˆ˜ k์˜ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ k์˜ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

outer๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  outer ํ•จ์ˆ˜์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด LexicalEnvironment์— ์žˆ๋Š” k๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ง€์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์–ด๋–ค ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜์ง‘๋Œ€์ƒ์—์„œ ์ œ์™ธ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— outer๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ inner๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‚ด๋ถ€ํ•จ์ˆ˜์ธ inner๋ฅผ ์–ธ์ œ๋“ ์ง€ ํ˜ธ์ถœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—ด๋ ค์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰, ๋ณ€์ˆ˜ k์— ์–ธ์ œ๋“ ์ง€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜์ง‘๋Œ€์ƒ์—์„œ ์ œ์™ธ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

const curry = (message) => (name) => `hi! ${name} ${message}`;

const greeting = curry('์•ˆ๋…•ํ•˜์„ธ์š”!');

greeting('harang'); // hi! harang ์•ˆ๋…•ํ•˜์„ธ์š”!
greeting('์Šน๋ฏผ'); // hi! ์Šน๋ฏผ ์•ˆ๋…•ํ•˜์„ธ์š”!

์ฐธ๊ณ : https://saseungmin.github.io/summary_of_technical_books/docs/javascript/core-javascript/chapter-5

๐ŸŽˆ ์Šค์ฝ”ํ”„โ€‹

์Šค์ฝ”ํ”„๋ž€ ์–ด๋–ค ๋Œ€์ƒ์„ ๋‹ค๋ฅธ ๋Œ€์ƒ๊ณผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ด๋ฆ„์„ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•œ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ์ด ์‹๋ณ„์ž๋Š” ์ž์‹ ์ด ์–ด๋””์— ์„ ์–ธ๋˜์–ด์žˆ๋Š”์ง€์— ์˜ํ•ด ์ž์‹ ์˜ ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

var x = 'global';

function foo () {
var x = 'function scope';
console.log(x);
}

foo(); // function scope
console.log(x); // global

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

๐ŸŽˆ IIFE (Immediately-Invoked Function Expression, ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜)โ€‹

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์ž๋งˆ์ž ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ณดํ†ต ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์— ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ private ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์ถฉ๋Œ์„ ๋ง‰์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽˆ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง, ์บก์ฒ˜๋ง, ์œ„์ž„โ€‹

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด๋ž€ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๊ทธ ์—˜๋ฆฌ๋จผํŠธ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ƒ์œ„ ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘๋ฐฉ์‹์€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ž…๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ์บก์ฒ˜๋ง์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด addEventListener์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ capture true๋ฅผ ์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•œ ๋’ค ํ•ด๋‹น ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ ์šฉ๋œ ์—˜๋ฆฌ๋จผํŠธ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์บก์ฒ˜๋ง์œผ๋กœ ๋ฐœ์ƒํ•˜๊ณ  ๋‹ค์‹œ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

๐ŸŽˆ ์ฝœ ์Šคํƒ๊ณผ ํž™โ€‹

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

๐ŸŽˆ ํ”„๋กœํ† ํƒ€์ž…โ€‹

์–ด๋–ค ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด Constructor์— ์ •์˜๋œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ , ์ด ์ธ์Šคํ„ด์Šค์—๋Š” __proto__ ๋ผ๋Š” constructor์˜ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ€์—ฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

__proto__์€ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋Š” constructor์˜ prototype์„ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ์ธ๊ฒƒ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

__proto__ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ๋‚˜์•„๊ฐ€๋‹ค๋ณด๋ฉด ์ตœ์ข…์ ์œผ๋กœ Object.prototype์— ๋„๋‹ฌํ•˜๊ฒŒ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ __proto__์•ˆ์— ๋‹ค์‹œ __proto__๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹์„ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ๋‹์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์ ์ธ ์›๋ฆฌ ๋•Œ๋ฌธ์— ์ €ํฌ๋Š” ๊ฐ์ž์˜ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ์ธ๋ƒฅ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž์‹ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋Œ€์ƒ์—์„œ๋ถ€ํ„ฐ ๋จผ ๋Œ€์ƒ์œผ๋กœ ๋‚˜์•„๊ฐ€๋ฉฐ, ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์œผ๋ฉด ์ค‘๋‹จํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Object.prototype์—๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” hasOwnProperty์™€ ๊ฐ™์€ ๋ฒ”์šฉ์ ์ธ ๋ฉ”์„œ๋“œ๋“ค์ด ์กด์žฌํ•˜๋ฉฐ, ๊ฐ์ฒด๋งŒ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋Š” Object ์ƒ์„ฑ์ž ์•ˆ์— ์Šคํƒํ‹ฑํ•˜๊ฒŒ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฐฉ์‹โ€‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ stack, webapis, task queue, event loop๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. stack์€ ์Šค์ฝ”ํ”„ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ, webapis๋Š” ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌํ•  ์ž‘์—…์„ ์Šคํƒ์œผ๋กœ ๋„˜๊ฒจ๋ฐ›์€ ํ›„ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. task queue๋Š” webapis์—์„œ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ์ž‘์—…์ด task queue์— ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. event loop๋Š” stack์— ๋‚จ์€ ํ• ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋Œ€๊ธฐ์ค‘์ธ task queue๋ฅผ stack์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์€ stack์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ๋“ค์ด ์กด์žฌํ•œ๋‹ค๋ฉด, webapis๋กœ ์˜ฎ๊ฒจ์„œ ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด task queue๋กœ ์ด๋™ํ•˜์—ฌ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋˜๊ณ , event loop๋Š” stack์— ๋น„์›Œ์ ธ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•œ ๋’ค ๋น„์›Œ์ ธ์žˆ์œผ๋ฉด task queue์— ์žˆ๋Š” ์ž‘์—…์„ stack์œผ๋กœ ์˜ฌ๋ฆฐ๋’ค ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

https://codermun-log.tistory.com/m/409

๐ŸŽˆ JavaScript์™€ ๊ด€๋ จํ•˜์—ฌ same-origin ์ •์ฑ…์„ ์„ค๋ช…ํ•˜์„ธ์š”.โ€‹

same-origin ์ •์ฑ…์€ JavaScript ๋„๋ฉ”์ธ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด์„œ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. origin์€ URI ์ฒด๊ณ„, ํ˜ธ์ŠคํŠธ์ด๋ฆ„, ํฌํŠธ๋ฒˆํ˜ธ์˜ ์กฐํ•ฉ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ ํ•œ ํŽ˜์ด์ง€์˜ ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ DOM์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์›น ํŽ˜์ด์ง€์˜ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽˆ "use strict"; ์ด ๋ฌด์—‡์ธ๊ฐ€์š”? ์‚ฌ์šฉ์‹œ ์žฅ๋‹จ์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?โ€‹

Strict ๋ชจ๋“œ๋Š” JavaScript ๋‹ค์–‘ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์žฅ์ ์œผ๋กœ๋Š” ์‹ค์ˆ˜๋กœ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์•”๋ฌต์ ์œผ๋กœ ์‹คํŒจํ•œ ์˜ˆ์™ธ๋ฅผ throwํ•˜์ง€ ๋ชปํ•˜๋Š” ํ• ๋‹น์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  this๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ์—์„œ undefined์ด๊ณ  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ ์œผ๋กœ๋Š” ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์ด ๋งŽ๊ณ , function.caller์™€ function.arguments์— ๋” ์ด์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์—„๊ฒฉํ•œ ๋ชจ๋“œ๋กœ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽˆ ๋™๊ธฐ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์„ธ์š”.โ€‹

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

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

๐ŸŽˆ ๊ณ ์ฐจ ํ•จ์ˆ˜(higher-order function)์˜ ์ •์˜๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?โ€‹

๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๊ฒฐ๊ณผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์–ด๋–ค ์—ฐ์‚ฐ์„ ์ถ”์ƒํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋กœ๋Š” ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์ธ map, reduce, filter๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋“ค์€ ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๋ณ€ํ™˜ํ•˜๊ณ , ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€‹

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

์ด๋•Œ ์ฝœ ์Šคํƒ์—์„œ ๋ฐ”๋กœ ํ๋กœ ๋„˜์–ด๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ค‘๊ฐ„์— Web APIs๋ฅผ ํ•œ ๋ฒˆ ๊ฑฐ์ณ ํ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์— ์œ„์ž„์„ ํ•ฉ๋‹ˆ๋‹ค.

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

async/await๋Š” Promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, then/catch/finally์™€ ๊ฐ™์€ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ์—†์ด ๋งˆ์น˜ ๋™๊ธฐ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://www.howdy-mj.me/javascript/asynchronous-programming

๐ŸŽˆ Chart.js vs D3.js (๊ฒฝํ—˜์˜ ์˜ํ•œ ๊ฐœ์ธ์ ์ธ ๋น„๊ต)โ€‹

Chart.js๋Š” ๊ธฐ๋ณธ ์œ ํ˜•์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ํ•ด์„ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์ œ์ž‘ ๊ธฐ๊ฐ„์ด ์งง์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Chart.js๋ฅผ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์กด์žฌํ•˜์—ฌ React์™€ ๊ฐ™์€ ํ”„๋ŸฐํŠธ์—”๋“œ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Chart.js๋Š” ๋ฌธ์„œํ™”๋„ ์ž˜ ๋˜์–ด ์žˆ์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋น„ํ•ด D3.js๋Š” ํ•™์Šต ๊ณก์„ ์ด ํ›จ์”ฌ ๋” ํฌ์ง€๋งŒ ๋ฌธ์„œํ™”๋Š” Chart.js์— ๋น„ํ•ด ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์น˜๋งŒ, Chart.js์— ๋น„ํ•ด ํ›จ์”ฌ ๋” ๋งŽ์€ custom์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„ ์œ ํ˜•์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

chartjs-vs-d3js

๐ŸŽˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜โ€‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ(reachability) ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€˜๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ(reachable)โ€™ ๊ฐ’์€ ์‰ฝ๊ฒŒ ๋งํ•ด ์–ด๋–ป๊ฒŒ๋“  ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์•„๋ž˜ ํ•ญ๋ชฉ์€ ๊ทธ ํƒœ์ƒ๋ถ€ํ„ฐ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ช…๋ฐฑํ•œ ์ด์œ  ์—†์ด๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜
    • ์ค‘์ฒฉ ํ•จ์ˆ˜์˜ ์ฒด์ธ์— ์žˆ๋Š” ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜
    • ์ „์—ญ ๋ณ€์ˆ˜
    • ๊ธฐํƒ€ ๋“ฑ๋“ฑ

์ด๋Ÿฐ ๊ฐ’์€ ๋ฃจํŠธ(root) ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
๋ฃจํŠธ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด๋‚˜ ์ฒด์ด๋‹์œผ๋กœ ๋ฃจํŠธ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋‚ด์—์„  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(garbage collector)๊ฐ€ ๋Š์ž„์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋Š” ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜โ€‹

'mark-and-sweepโ€™์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๋ฃจํŠธ(root) ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ด๋ฅผ โ€˜mark(๊ธฐ์–ต)โ€™ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฃจํŠธ๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ์ด๊ฒƒ๋“ค์„ โ€˜markโ€™ ํ•ฉ๋‹ˆ๋‹ค.
  • mark ๋œ ๋ชจ๋“  ๊ฐ์ฒด์— ๋ฐฉ๋ฌธํ•˜๊ณ  ๊ทธ ๊ฐ์ฒด๋“ค์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋„ mark ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ๋ฐฉ๋ฌธํ•œ ๊ฐ์ฒด๋Š” ์ „๋ถ€ mark ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฃจํŠธ์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  • mark ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ ํ™” ๊ธฐ๋ฒ•:

  • generational collection(์„ธ๋Œ€๋ณ„ ์ˆ˜์ง‘) โ€“ ๊ฐ์ฒด๋ฅผ '์ƒˆ๋กœ์šด ๊ฐ์ฒดโ€™์™€ '์˜ค๋ž˜๋œ ๊ฐ์ฒดโ€™๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ƒ๋‹น์ˆ˜๋Š” ์ƒ์„ฑ ์ดํ›„ ์ œ ์—ญํ• ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•ด ๊ธˆ๋ฐฉ ์“ธ๋ชจ๊ฐ€ ์—†์–ด์ง€๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฐ์ฒด๋ฅผ '์ƒˆ๋กœ์šด ๊ฐ์ฒดโ€™๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์ด๋Ÿฐ ๊ฐ์ฒด๋ฅผ ๊ณต๊ฒฉ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” '์˜ค๋ž˜๋œ ๊ฐ์ฒดโ€™๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ , ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋œ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • incremental collection(์ ์ง„์  ์ˆ˜์ง‘) โ€“ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ๊ฐ์ฒด๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐฉ๋ฌธํ•˜๊ณ  mark ํ•˜๋Š”๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์–ด ์‹คํ–‰ ์†๋„๋„ ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ ค์ง€๊ฒ ์ฃ . ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ด๋Ÿฐ ํ˜„์ƒ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„๋ฆฌํ•œ ๋‹ค์Œ, ๊ฐ ๋ถ€๋ถ„์„ ๋ณ„๋„๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๊ธด ์ง€์—ฐ์„ ์งง์€ ์ง€์—ฐ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • idle-time collection(์œ ํœด ์‹œ๊ฐ„ ์ˆ˜์ง‘) โ€“ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์‹คํ–‰์— ์ฃผ๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด CPU๊ฐ€ ์œ ํœด ์ƒํƒœ์ผ ๋•Œ์—๋งŒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

https://ko.javascript.info/garbage-collection