๐ JavaScript
๐ const
์ var
์ ์ฐจ์ด์ ์?โ
var
์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๊ฐ ์๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ญ์์ ์ฐธ์กฐํ ์ ์๊ณ , let
์ด๋ const
๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ง์ญ ๋ณ์๋ก ์ฝ๋ ๋ธ๋ก๋ด์ ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋ ๋ค.
var
์ ๋ณ์ ์ ์ธ ์ ์ ์ฐธ์กฐํด๋ ์๋ฌ๊ฐ ๋์ง ์๊ณ undefined
๋ฅผ ๋ฐํํ์ง๋ง, let
์ ๋ณ์ ์ ์ธ๋ฌธ์ ์ ํด๋น ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด Reference Error๋ฅผ ๋ฐํํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ฅผ ์คํ ์ปจํ
์คํธ ๊ด์ ์์ ๋ณด์๋ฉด var
์ ๋ณ์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ณผ์ ์ด ๋์์ ์ผ์ด๋๊ฒ ๋๋๋ฐ, ์ค์ฝํ์ ๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋กํ ๊ณต๊ฐ์ ํ๋ณดํ ํ undefined
์ด๊ธฐํ ๊ณผ์ ์ ๊ฑฐ์ณค๊ธฐ ๋๋ฌธ์ ์ ์ธ ์ด์ ์ ์ฐธ์กฐํด๋ undefined
๋ฅผ ๋ฐํํ ์ ์๋ ๊ฒ์
๋๋ค. let
์ ๋ณ์ ์ ์ธ๊ณผ ์ด๊ธฐํ ๊ณผ์ ์ด ๋ฐ๋ก ์ด๋ฃจ์ด์ง๋๋ฐ, ์ด์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฉด ์ค์ฝํ์ ๋ณ์๋ฅผ ๋ฑ๋กํ์ง๋ง ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ ๊ณต๊ฐ์ ํ๋ณดํ์ง ๋ชปํ๊ณ ๋ณ์ ์ ์ธ๋ฌธ์ ๋ง๋ ๊ทธ ์์ ์ ์ด๊ธฐํ ๊ณผ์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ฐธ์กฐํ๋ฉด ์ฐธ์กฐ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์ค์ฝํ์ ์์๋ถํฐ ๋ณ์ ์ ์ธ๋ฌธ์ ๊น์ง์ ๊ณต๊ฐ์ TDZ(์ผ์์ ์ฌ๊ฐ์ง๋)๋ผ๊ณ ํฉ๋๋ค.
let
๊ณผ var
์ ์ฌํ ๋น์ด ๊ฐ๋ฅํ์ง๋ง const
๋ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ const
๋ ๋ณ์๋ฅผ ์ ์ธ๊ณผ ๋์์ ํ ๋น์ ํด์ผ ํฉ๋๋ค.
๐ ํธ์ด์คํ ์ด๋โ
ํธ์ด์คํ
์ด๋ ๊ฐ๋
์์ฒด๋ ์ฝ๋ ํด์์ ์ข ๋ ์์ํ๊ฒ ํ๊ธฐ ์ํด ๋์ด์ฌ๋ฆฐ๋ค๋ผ๊ณ ํด์ํ๊ณ ์์ต๋๋ค.
๋ณ์๊ฐ ์ ์ธ๊ณผ ๊ฐ ํ ๋น์ด ๊ฐ์ด ์ด๋ฃจ์ด์ง ๋ฌธ์ฅ์ ์ ์ธ๋ถ๋ง ํธ์ด์คํ
๋๊ณ , ํ ๋น๋ฌธ์ ๊ทธ์๋ฆฌ์ ๊ทธ๋๋ก ์ ์งํ๊ณ ์๊ฒ๋ฉ๋๋ค. ์ด๋ ํจ์์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์ ์ฐจ์ด์ ์ด ์๋๋ฐ ํจ์ ์ ์ธ๋ฌธ์ ํจ์์์ฒด ํต์ฒด๋ก ๋์ด์ฌ๋ฆฌ๊ฒ๋๊ณ , ํจ์ ํํ์์ ์์ด๊ธฐ ๋๋ฌธ์ ์ ์ธ๋ถ๋ง ํธ์ด์คํ
๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ 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
์์ฑ์ ์์ ์คํํฑํ๊ฒ ๋ด๊ฒจ์์ต๋๋ค.