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

test

๐Ÿ‘‰ const์™€ let, var์˜ ์ฐจ์ด์ ์€?โ€‹

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

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

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

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

var a = 1;
var outer = function () {
var inner = function () {
console.log(a);
var a = 3;
}

inner();
console.log(a);
}

outer();
console.log(a);

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

๐Ÿ‘‰ thisโ€‹

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

๐Ÿ‘‰ ํด๋กœ์ €โ€‹

ํด๋กœ์ €๋Š” ์˜ˆ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

function outer() {
var x = 2;

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

return inner;
}

var innerFunc = outer();
innerFunc();

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

๐Ÿ‘‰ ์Šค์ฝ”ํ”„โ€‹

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

var x = 'global';

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

foo();
console.log(x);

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

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

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

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

<div>
<ul>
<li>์•ˆ๋…•ํ•˜์„ธ์š”</li>
</ul>
</div>

์œ„์™€ ๊ฐ™์€ ์˜ˆ๊ฐ€ ์žˆ๊ณ  ๊ฐ์ž์˜ ์—˜๋ฆฌ๋จผํŠธ ํƒœ๊ทธ๋งˆ๋‹ค ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

document.querySelector('div').addEventListener(() => console.log('div'));

๊ทธ๋Ÿฐ๋‹ค์Œ ๊ฐ€์žฅ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ์ธ li์„ ํด๋ฆญํ•˜๋ฉด li, ui, div ์ˆœ์œผ๋กœ ํด๋ฆญ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ด๋ฒคํ‹‘ ๋ฒ„๋ธ”๋ง์€ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ์˜ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์—˜๋ฆฌ๋จผํŠธ์˜ ์ด๋ฒคํŠธ๊นŒ์ง€ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํŠธ ๋™์ž‘ ๋ฐฉ์‹์€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ž…๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ์บก์ฒ˜๋ง์€ ์‚ฌ์šฉํ•  ์ผ์€ ๊ฑฐ์˜ ์กด์žฌํ•˜์ง€ ์•Š๊ณ , ๋ฐ˜๋Œ€๋กœ ์บก์ฒ˜๋ง๋œ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋จผ์ € ์•„๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š”๋ฐ, addEventListener์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž์— capture true๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ul ํƒœ๊ทธ์— capture์„ ์ ์šฉํ•˜๋ฉด ์ ์šฉ๋œ ul ํƒœ๊ทธ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜๊ณ  ๊ทธ๋‹ค์Œ ๋‹ค์‹œ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ul -> li -> div ์ˆœ์ž…๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ์œ„์ž„์€ ์ œ๊ฐ€ ์‚ฌ์šฉ์„ ํ•ด๋ณธ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋Š”๋ฐ์š”. ๋ฐ”๋‹๋ผ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์œ„์ž„์€ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ์˜ ์ด๋ฒคํŠธ์˜ ์—ญํ• ์ด ๋™์ผํ•  ๋•Œ ์ผ์ผํžˆ ๊ฐ์ž ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ผ ์ƒ์œ„ ์—˜๋ฆฌ๋จผํŠธ ํ…Œํฌ ํ•˜๋‚˜์—๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์œผ๋กœ๋Š” ๊ฐ์ž๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ๋•Œ๋Š” ๊ทธ๋งŒํผ์˜ ์ฝ”๋“œ๊ฐ€ ๋” ๋งŽ์ด ์ž‘์„ฑํ•˜๊ฒŒ๋˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ๋•Œ๋Š” ๊ทธ๋งŒํผ ์ฝ”๋“œ์˜ ์–‘์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ์ด ์กด์žฌํ•˜๋‹ˆ ๊ทธ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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