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์ ์ ์ฑ์์์ ์คํํฑํ๊ฒ ๋ค์ด์์ต๋๋ค.