๐ค JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ์ ๋ฌด์์ผ๊น ?
- ๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด
- JavaScript ํ๋ณํ
- ==, ===
- ๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด์ ๋ฌธ์ ์ ์ ๋ฌด์์ด๊ณ ๋ณด์ํ ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ฌด์์ด ์์์ง ์๊ฐํด๋ณด์ธ์.
- undefined์ null์ ๋ฏธ์ธํ ์ฐจ์ด๋ค์ ๋น๊ตํด๋ณด์ธ์.
C์ธ์ด๋ ๋์จํ ํ์ ์ ์ธ์ด์ผ๊น? ์๋๋ค. C์ธ์ด๋ int num = ... ์ฒ๋ผ ์ ์ธ์ ํ๋๋ฐ, num ๋ณ์์๋ ์ซ์, ๊ทธ ์ค์์๋ ์ ์๋ฅผ ์ ์ธํ ์ ์๋ ๋ณ์๋ผ๊ณ ๋ชป์ ๋ฐ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ '๊ฐ๋ ฅํ ํ์ (Strong typing)'์ด๋ผ๊ณ ํ๋ค.
ํ์ง๋ง JavaScript๋ ๊ทธ๋ ์ง ์๋ค. const num = ...; ์ด๋ผ๊ณ num ๋ณ์๋ฅผ ๋ง๋ค์ง๋ง ์ฌ๊ธฐ์๋ String, Object๋ฅผ ๋น๋กฏํ ๋ชจ๋ ํ์ ๋ค์ด ๋ค์ด์ฌ ์ ์๋ค. ๋ฌผ๋ก Sementic์ ์ธ ๋ถ๋ถ์์ ๋ง์ง ์์ง๋ง ์์ง์ ๊ด์ ์์๋ ์ ํ ๋ฌธ์ ๋ ๊ฒ์ด ์๋ค. ๊ทธ๋์ '๋์จํ ํ์ (Loosely typed)'์ด๋ผ๊ณ ํ๋ค.
๋์ ์ธ์ด์ ์ ์ ์ธ์ด๋ผ๋ ๊ฒ๋ ์ด๋ฐ ์๋ฏธ์์ ์ดํด๋ฅผ ํ ์ ์๋ค. ์ ์ ์ธ์ด์ธ C๋ ์ฝ๋์ ์ง์ ๋ ์๋ฃํ์ ์ปดํ์ผ ์์ ๊ฒฐ์ ์ ํ๋๋ฐ ์ด๋ ์ฝ๋์ ์ง์ ๋ ์๋ฃํ๊ณผ ๋ค๋ฅธ ์๋ฃ๊ฐ ๋ค์ด์ ์์ผ๋ฉด C์์ ์์ฃผ ๋ณผ ์ ์๋ ๊ทธ ์๋ฌ, Compile Error๋ฅผ ๋ง์ฃผํ ์ ์๋ค.
๋ฐ๋๋ก ๋์ ์ธ์ด๋ ์ปดํ์ผ ์ ์๋ฃํ์ ์ ํ๋ ๊ฒ์ด ์๋๊ณ ์คํ ์์ ๊ฒฐ์ ์ ํ๋ค. Run Time ๋ ์๋ณ์๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ์๋ฃํ์ด ์ ํด์ง๋ค.
๋ค๋ฅด๊ฒ ์๊ฐํด ๋ณผ ํ์๊ฐ ์๋ค. C์ธ์ด์ฒ๋ผ ์ ์ ์ธ์ด, ๊ฐ๋ ฅํ ํ์ ๋ ์ฅ์ ์ด ์๋ค. ๋ฐ๋ก ํ์ ์ ์์ ์ฑ์ ํ๋ณดํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ฉด์ ๋์ ์ธ์ด๋ ์ ์ฐํ๊ธฐ ๋๋ฌธ์ ์คํ ๋์ค์ ๋ณ์์ ์์์น ๋ชปํ ํ์ ์ด ๋ค์ด๊ฐ ์๋ ์๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด Type Error๋ฅผ ๋ง๋๊ฒ ๋๋ค.
TypeScript๋ JavaScript์ ๋ํ์ ์ผ๋ก ๋ค๋ฅธ ์ ์ด ํ์ ์ ์์ ์ฑ์ ํ๋ณดํ ์ ์๋ค๋ ์ ์ด๋ค. ๊ทธ๋งํผ ๊ฐ๋ฐ์์ ํ์ ์ ์์ ์ฑ์ด๋ ์ค์ํ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ TypeScript๋ก JavaScript์ ๋์ ์ธ ๋ถ๋ถ์ ๋ณด์ํด ์ค ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์คํ๋ ค ์ ์ฐํ ๋ถ๋ถ์ด JavaScript์ ํฐ ๋จ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ๋ณํ์ ๊ฐ์ ์๋ฃ'ํ', ์ฆ type์ ๋ณํํด ์ฃผ๋ ๊ฒ์ ๋งํ๋ค. "1"์ฒ๋ผ ๋ฌธ์์ด๋ก ์ซ์๊ฐ ์๋ค๋ฉด parseInt(1)์ ํ ์๋ ์๊ณ Number(1)์ ํ ์๋ ์๊ณ 1*1์ ํด์ฃผ์ด๋ ๋๋ค. ๊ทธ๋ผ ์ ํ๋ณํ์ ํด์ค๊น?
const num1 = "1";
const num2 = "2";
let result = num1+num2; // '12'
result = Number(num1)+Number(num2); // 3
์์ ๊ฐ์ ์ํฉ์์ 1+2๋ฅผ ํ๋ฉด 12๊ฐ ๋์จ๋ค. ์ฆ ํ๋ณํ์ ํ์ง ์์ผ๋ฉด String ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ๋ถ์ฌ๋ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ result์ ํ ๋น๋๋ค. ๊ทธ๋์ ๋ง์ง๋ง ์ค์ฒ๋ผ ํ ๋ณํ์ ํด์ฃผ๊ณ ์ฐ์ฐ์ ํด์ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ 3์ ์ป์ ์ ์๋ค.
์์ฒ๋ผ ํ๋ณํ์ ํด์ฃผ๋ ๊ฒ์ ๋ช ์์ ํ๋ณํ์ด๋ผ๊ณ ํด์ค๋ค. Number์ด๋ผ๋ ํจ์๋ฅผ ์จ์ '๋ช ์'ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๋ถ๋ฅธ๋ค.
์์์ ํ๋ณํ์ด๋ผ๊ณ ์๋ค.
const num1 = 1;
const num2 = "2";
let result = num1+num2; // '12'
์ ์ฝ๋์์ num1์ Number ํ์ ์ด๋ค. ๊ทธ๋ฐ๋ฐ String ํ์ ์ธ num2์ ๋ํด์ฃผ๋๊น '12'๋ผ๋ String ํ์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค. ์ด์ฒ๋ผ ๋ช ์๋ฅผ ํด์ฃผ์ง ์์๋๋ฐ๋ ์๋์ผ๋ก ๋ณํ๋๋ ๊ฒ์ ์์์ ํ๋ณํ์ด๋ผ๊ณ ํ๋ค.
JavaScript์์๋ ===์ด ์๋ค. ์ฒ์์ C๋ฅผ ํ๋ค๊ฐ ๋์ด์์ ๋ ๋น์ฐํ ๊ฐ๋ค๋ ์ฐ์ฐ์๋ ==๊ฒ ์ง ํ๋๋ฐ, ๋ด๊ฐ ์๋ํ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ ๋๊ฐ ์์๋ค. ๊ฐ๋จํ ์์ ์ฝ๋๋ฅผ ๋ณด์.
const num1 = '0';
const num2 = 0;
console.log(num1==num2); // true
console.log(num1===num2); // false
๋ฌด์จ ์ฐจ์ด๊ธธ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅด๊ฒ ์ถ๋ ฅํด ์ฃผ๋ ๊ฒ์ผ๊น? ์๊ฒฉํ ๋น๊ต๋ฅผ ํ๋ ๊ฒ๊ณผ ์ ์ฐํ ๋น๊ต๋ฅผ ํ๋ ๊ฒ์ ์ฐจ์ด๋ผ๊ณ ํ ์ ์๋ค. ==์ ๊ฐ์ด ๊ฐ์ผ๋ฉด true๋ฅผ ๋ฐํํด ์ค๋ค. ํ์ง๋ง ===์ ๊ฐ๊ณผ ์๋ฃํ์ด ๋ชจ๋ ๊ฐ์์ผ true๋ฅผ ๋ฐํํด ์ค๋ค.
NULL. C์ธ์ด๋ฅผ ํ ๋ ๊ต์ฅํ ์์ฃผ ๋ดค์๊ณ , ๋ณ์์ garbage value๊ฐ ํ ๋น์ด ๋์ง ์๊ฒ ํด์ฃผ๊ณ ๋ฌธ์ฅ์ ๋์ ํ๋ณํ๊ฒ ํด์ฃผ๋ ๊ณ ๋ง์ด ์น๊ตฌ๋ค. ๊ทธ๋ฐ๋ฐ JavaScript๋ก ์ค๋ undefined๋ผ๋ ํ์ ๋ ์์๋ค. ๋ ๋ค ๋ฐ์ดํฐ ํ์ ์ค ํ๋์ด๊ณ ํด๋น ๋ณ์์ ๊ฐ์ด ์๋ค๋ ๊ฒ์ ๋ํ๋ด๋๋ฐ, ์ด ๋ ์ฐจ์ด๋ ๋ญ๊น?
undefined๋ ๋ฐ์ดํฐ ํ์ ์ด์ ๊ฐ์ ๋ํ๋ธ๋ค. ์๋ฅผ ๋ค๋ฉด, var ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์์ง์ ์คํ ์ฝํ ์คํธ ์ด๊ธฐํ ๊ณผ์ ์์ var์ undefined๋ฅผ ํ ๋นํด ์ค๋ค. ๋ง์ฝ ๋ค๋ฅธ ๊ฐ์ด ํ ๋น๋๊ธฐ ์ ์ ์ถ๋ ฅ์ ํ๋ฉด undefined๋ผ๊ณ ์ถ๋ ฅ๋ ๋๋ค.
์ด์ ๋ฐํด null์ ์ด ๋ณ์๊ฐ ํ ๋น์ด์๋ค๋ ๊ฒ์ ๋ํ๋ด๋๋ฐ ์ฌ์ฉ์ ํ๋ค. ์ฆ ํด๋น ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋น์ด์๋ค๋ ๋ป์ด๋ค. undefined์๋ ์์ ํ ๋ค๋ฅธ ๊ฐ๋ ์ธ ๊ฒ์ด๋ค.
๐ค JavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด๋ ?
๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋๋์์ ์ฐจ์ด๊ฐ ์๋ค. ๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด์๋ ๊ฐ์ ์ฃผ์๋ฅผ ๋ฐ๋ก ๋ฐ๋ ๊ฒ์ด๊ณ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ '๊ฐ์ ์ ์ฅํ๋ ์ฃผ์๋ฅผ ์ ์ฅํ๋' ์ฃผ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋ค. ์๋ ์ฌ์ง์ ๋ณด๋ฉด ๋ ์ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ ์ด๋ ๊ฒ 'abc'๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ 5004๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋ค.
์ฐธ์กฐํ ๋ฐ์ดํฐ๋ ์กฐ๊ธ ๋ ๋ณต์กํ๋ค. ๋จผ์ Object๋ผ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ์ 7103๋ถํฐ ๋ฏธ๋ฆฌ ํ๋ณดํด ๋๊ณ ๊ทธ ์ฃผ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ 5002์ ํ ๋น์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฃผ์ 5002๋ฅผ obj๊ฐ ๊ฐ์ผ๋ก ๊ฐ๊ฒ ๋๋ค.
ํ๋กํผํฐ๋ค์ ๊ฐ ํ ๋น์ ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ๊ฐ๋ค. 1๊ณผ 'bbb'๊ฐ ์ ์ฅ๋ ์ฃผ์๋ฅผ ์ฃผ์ 7103๊ณผ 7104๊ฐ ๊ฐ๊ฒ ๋๋ ๋ฐฉ์์ด๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์ obj๋ฅผ obj2์ ํ ๋นํ๊ณ obj2์ b๋ฅผ ๋ณ๊ฒฝ์ํจ ๋ค์์ obj๋ฅผ ์ถ๋ ฅํด๋ณด์.
const obj = {
a: 1,
b: 'bbb',
};
const obj2 = obj;
obj2.b = 2;
console.log(obj);
/*
obj = {
a: 1,
b: 2,
};
*/
obj์ b ํ๋กํผํฐ๊ฐ 2๊ฐ ๋์๋ค. ์ ๊ทธ๋ด๊น? ๊ทธ๊ฒ์ obj2๋ obj์ ๊ฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๋ค. ๊ฐ์ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ obj2์ ํ๋กํผํฐ๋ฅผ ์์ ํ๋ฉด ๊ฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ obj์ ์ถ๋ ฅ์ด ์ ๋ ๊ฒ ๋๋ ๊ฒ์ ์ ์ ์๋ค.
๋ถ๋ณ ๊ฐ์ฒด. ํ ๋ฒ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ ๋ ๋ณํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฅผ ์ํด์๋ ๊น์ ๋ณต์ฌ๋ฅผ ํด์ผ ํ๋ค. ํํ๋ค ๊น์ ๋ณต์ฌ๋ผ๊ณ ํ๋ฉด Spread ์ฐ์ฐ์๋ฅผ ์๊ฐํ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์๋ Spread๊ฐ ๋จนํ๊น?
const obj1 = {
a: 1,
b: "bbb",
c: {
c1: "shallow"
}
};
const obj2 = {
...obj1,
d: "copy done!"
};
obj2.c.c1 = "I modified it"
console.log(obj1.c.c1); // "I modified it"
๊น์ ๋ณต์ฌ๊ฐ ์๋๋ค. ์ค์ฒฉ๋ ๊ฐ์ฒด๋ ์ฌ์ ํ ์์ ๋ณต์ฌ๊ฐ ๋๋ค. ์ด๋ด ๋ ์ด๋ป๊ฒ ํด์ผ ์์ ํ ๋ณต์ฌ๋ฅผ ํ ์ ์์๊น?
๊ฐ์ฅ ๊ฐ๋จํ๊ฒ๋ JSON ๋ฌธ์๋ก obj1์ ๋ณํ์์ผ์ ๊ทธ JSON ๋ฐ์ดํฐ๋ฅผ ๋ค์ ํ์ฑํ์ฌ obj2์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด obj2๋ ํ์ฑ๋ JSON ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๊ฒ ๋๋ค. ๋ฐฉ๋ฒ์ ์๋ ์ฝ๋์ ๊ฐ๋ค.
const obj1 = {
a: 1,
b: "bbb",
c: {
c1: "shallow"
}
};
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.c.c1 = "I modified it"
console.log(obj1.c.c1); // "shallow"
๐ค ํธ์ด์คํ ๊ณผ TDZ๋ ๋ฌด์์ผ๊น ?
JavaScript์์ ์ค์ฝํ(Scope) ๋ผ๋ ๋ง์ ๊ต์ฅํ ์์ฃผ ์ ํ์ ๊ฒ์ด๋ค. ์ค์ฝํ๋ JavaScript์์ ์ค์ํ ๊ฐ๋ ์ด๋ค. ๊ทธ ์ด์ ๋ฅผ ES3์ ๋ด์ฉ์์ ์ฐพ์ผ๋ฉด 'Scope Chain์ ์คํ ์ฝํ ์คํธ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์๋ณ์ ํด๊ฒฐ์ ์ํด์ ์ฌ์ฉํ๋ค'๋ผ๊ณ ๋์์๋ค. ๋ค๋ง ES5์์๋ Scope chain์ ์ฌ์ฉํ์ง ์๋๋ค. ์ด ๋ด์ฉ์ ๋ณด๋ฉด ์ค์ฝํ๋ ๋ฒ์(Scope)๋ฅผ ์ ํํ์ฌ ์๋ณ์๋ฅผ ํด๊ฒฐํ๋ค๊ณ ํ ์ ์๋ค.
์๋ณ์ ํด๊ฒฐ์ ๋ ๋ญ๊น? ์๋ณ์ ํด๊ฒฐ์ ๋ณ์๋ ํจ์์ ์ด๋ฆ์ ์ฐพ๋ ๊ฒ์ ๋งํ๋๋ฐ, ์ด๋ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ ์ค์ฝํ๋ ์๋ณ์ ํด๊ฒฐ์ ์ํ ๊ฒ์ด๋ค.
์์ง์ด function ํค์๋๋ฅผ ๋ง๋๋ฉด function ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ ๊ทธ ๋ด๋ถ ํ๋กํผํฐ์ธ [[Scope]]์ ์ค์ฝํ๋ฅผ ์ค์ ํ๋๋ฐ, ์ด๋ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ค. ์ดํ์ ์ด [[Scope]]๋ ์คํ ์ปจํ์คํธ์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ์๋ ๋ฐ์ธ๋ฉ ๋๋ค.
์์ 'function ํค์๋๋ฅผ ๋ง๋๋ฉด ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.'๋ผ๊ณ ํ๋๋ฐ ์ด ๋ถ๋ถ์ ํธ์ด์คํ
๊ณผ๋ ์ฐ๊ฒฐ์ด ๋๋ค. ํธ์ด์คํ
์ ์ฉ์ด๋ณด๋ค๋ ๊ฐ๋
์ผ๋ก ์ ๊ทผ์ ํด์ผ ํ๋ค. ๋ณ์๋ ํจ์๊ฐ ์ ์ธ๋๋ ์์น ์์์ ์ฌ์ฉ ๋ฐ ํธ์ถ์ ํ๋ ๊ฐ๋
์ธ๋ฐ ์ด๊ฒ ๋๋ ๊ฒ๊ณผ ์ ๋๋ ๊ฒ์ด ์๋ค.
ํจ์ ์ ์ธ์๊ณผ var ๋ณ์๋ ํธ์ด์คํ
์ด ๊ฐ๋ฅํ๊ณ ํจ์ ํํ์๊ณผ let, const ๋ณ์๋ ํธ์ด์คํ
์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ฌ๊ธฐ์ ํจ์ ์ ์ธ์๊ณผ ํจ์ ํํ์์ ๋ํ ๋ด์ฉ์ ๋จผ์ ์์๋ณด๋๋ก ํ์. ๋ ์ฐจ์ด๋ ์ฝ๋๋ก ํ์ธํ๋ ๊ฒ ํจ์ฌ ๋ ๋ช ํํ๋ค.
func1(); // ๋ ์ ์ธ์์.
func2(); // Uncaught ReferenceError: func2 is not defined
function func1() {
console.log("๋ ์ ์ธ์์.");
} ;
const func2 = function(){
console.log("๋ ํํ์์.");
};
func1์ ํจ์ ์ ์ธ์์ด๋ค. functionํค์๋๋ฅผ ํตํด์ ๋ฐ๋ก func1์ด๋ผ๋ ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ฉด, func2๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ฑฐ๊ธฐ์ functionํค์๋๋ฅผ ์ด์ฉํด์ function์ค๋ธ์ ํธ๋ฅผ ํ ๋นํด์ฃผ๋๋ฐ, ์ด ๋ฐฉ๋ฒ์ด ํจ์ ํํ์์ด๋ค. ํฐ ์ฐจ์ด๊ฐ ์์ด ๋ณด์ด๋ ์ด ๋์ ์ฐจ์ด๋ ์์ ๋งํ ํธ์ด์คํ ์ด๋ ๊ฐ๋ ์์ ์ฐจ์ด๊ฐ ๋๋ค.
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด func1๊ณผ func2๋ฅผ ๊ฐ๊ฐ ์ ์ธํ๊ธฐ ์ ์ ํธ์ถ์ ํ๋ค. ๊ทธ๋ฐ๋ฐ func1์ ์ ์์ ์ผ๋ก ํธ์ถ์ด ๋๊ณ , func2๋ ์๋ฌ๋ฅผ ๋ฑ์ด๋๋ค. ๊ทธ ์ด์ ๋ 'functionํค์๋๋ฅผ ๋ง๋๋ฉด ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.'๋ผ๋ ๋ง์ ๋ด๊ฒจ์๋ค.
JavaScript๋ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ์์ง์ ์คํ๋๊ธฐ ์ ์ ๋ ๋ฒ ํ์์ ํ๋ค. ์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ํ์ ๊ณผ์ ์์ ํจ์ ์ ์ธ์์ ์ฐพ์๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์๋์ ๊ฐ์ด ์๋ณ์ ํด๊ฒฐ์ ํ๋ค.
{func1: function์ค๋ธ์ ํธ(์ค์ฝํ ์ค์ )}
๋ ๋ฒ์งธ ํ์ ๊ณผ์ ์์๋ ๋ณ์๋ฅผ ์ฐพ๋๋ค. var๋ณ์์ ๋ํ ์๋ณ์๋ฅผ ํด๊ฒฐํ๋๋ฐ, var๋ ์๋ณ์๋ฅผ ์ค์ ํจ๊ณผ ๋์์ undefined๋ฅผ ํ ๋นํด์ฃผ๊ณ , let๊ณผ const๋ ๋ค์ ๋จ๊ณ์ธ ์ฝ๋ ์คํ ๋จ๊ณ์์ ๋ณ์๋ฅผ ์ ์ธํ๋ ์์น์ ์์์ผ ์๋ณ์๊ฐ ํด๊ฒฐ๋๋ค.
console.log(num3);
try{
console.log(num1);
} catch{
console.log("num1์ ๋ํ ์๋ณ์๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.");
}
try{
console.log(num2);
} catch{
console.log("num2์ ๋ํ ์๋ณ์๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.");
}
const num1 = 1;
let num2 = 2;
var num3 = 3;
console.log(num1); // 1
console.log(num2); // 2
์คํ์ ํด๋ณด๋ฉด num3๋ ์ถ๋ ฅ์ด ์ ๋์ง๋ง num1, num2๋ catch๋ฌธ์ด ์ถ๋ ฅ๋๋ ๊ฑธ ๋ณผ ์ ์๋ค. ์ฆ ์๋ณ์๊ฐ ํด๊ฒฐ์ด ์๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฐ์ ์๋ ์ฝ์ ์ถ๋ ฅ์์๋ ์ ์์ ์ผ๋ก ์ถ๋ ฅ์ด ๋๋ค. ์ด๋์์ผ ๋น๋ก์ ์๋ณ์๊ฐ ํด๊ฒฐ์ด ๋ ๊ฒ์ด๋ค.
ํจ์ ํํ์์ ์ฝ๋์์ ํด๋น ๋ณ์๊ฐ ์ ์ธ๋๋ ์์น์ ๊ฐ์ ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ๊ณผ์ ์์ functionํค์๋๋ฅผ ์๋ณํ๋ฉด ๊ทธ๋์์ผ function์ค๋ธ์ ํธ๋ฅผ ์์ฑํด์ ํด๋น ๋ณ์์ ์ ์ธํด์ฃผ๊ณ , ์ด๋๋ฅผ ๊ธฐ์ ์ผ๋ก ํธ์ถ์ ํ ์ ์๋ ๊ฒ์ด๋ค.
์์์ ์ค๋ช ํ ๋ด์ฉ์ฒ๋ผ ํธ์ด์คํ ์ด ์๋๋ ์์๋ค์ ์ ์ธ๋๋ ์์น ์์์ ํธ์ถ ๋ฐ ์ฌ์ฉ์ ํ ์ ์๋ค. ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๋ ์์น๋ฅผ TDZ(Temporary Dead Zone)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๐ค ์ค์ต ๊ณผ์
- ์ฝ์์ ์ฐํ b ๊ฐ์ ์์ํด๋ณด๊ณ , ์ด๋์์ ์ ์ธ๋ โbโ๊ฐ ๋ช๋ฒ์งธ ๋ผ์ธ์์ ํธ์ถํ console.log์ ์ฐํ๋์ง, ์ ๊ทธ๋ฐ์ง ์ค๋ช ํด๋ณด์ธ์.
์ฃผ์์ ํ์ด๋ณด๊ณ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด ์ ์ค๋ฅ๊ฐ ๋๋ ์ง ์ค๋ช ํ๊ณ ์ค๋ฅ๋ฅผ ์์ ํด๋ณด์ธ์.
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b); // 1,101
}
//console.log(a); // hiํจ์ ์์ ์ ์ธ๋ const๋ณ์ a์๋ ํจ์ ๋ฐ์์ ์ ๊ทผํ ์ ์๋ค.
console.log(b); // 1
hi();
console.log(b); // 1
๊ตฐ๋๋๊ธฐ ์๋ ์ ๋ฆฌ๋ค์! ์ง๋ต์ผ๋ก ์ฐ์๋ ๋ฌธ์ ๋ฅผ ๋ต๋ณํด์ฃผ์๋๊น ์์ด ๋ค ์์ํฉ๋๋ค๐