๐ค ํธ์ด์คํ ๊ณผ TDZ๋ ๋ฌด์์ผ๊น ?
ํธ์ด์คํ
ํธ์ด์คํ ์ด๋, ๋ณ์์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ธ ์ ์ ๋ฏธ๋ฆฌ ํ ๋นํด๋๋๊ฒ
๋ณ์,ํจ์์ ์ ์ธ๋ถ๊ฐ ์์นํ ์ธ์ ์ค์ฝํ์ ์์ ์ง์ ์์ ํด๋น ์๋ณ์์ ๊ด์ธก์ด ๊ฐ๋ฅํ ํ์
- ์๋ฐ์คํฌ๋ฆฝํธ Parser๊ฐ ํจ์ ์คํ ์ ํด๋น ํจ์๋ฅผ ํ ๋ฒ ํ๋๋ค.
- ํจ์ ์์ ์กด์ฌํ๋ ๋ณ์/ํจ์์ ์ธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ ์คํ์ํจ๋ค.
- ์ ํจ ๋ฒ์: ํจ์ ๋ธ๋ก {} ์์์ ์ ํจ
JS์์ง์ด ๋ชจ๋ ์ค์ฝํ ๋๋ ์คํ ์ปจํ ์คํธ๋ฅผ ํ์ํ๋ฉฐ ์ฌ๋ฌ ๋ณ์ ๊ฐ์ฒด์ ์๋ณ์๋ฅผ ์์งํ๋ค. ์ด๋ ๊ฒ ์คํ ์์ ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ์ ์ธ๋ ์๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ์ด๋ฏธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ธ ์ด์ ์ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋๊ฒ์ด๋ค.
์ฆ, ํจ์ ๋ด์์ ์๋์ชฝ์ ์กด์ฌํ๋ ๋ด์ฉ ์ค ํ์ํ ๊ฐ๋ค์ ๋์ด์ฌ๋ฆฌ๋ ๊ฒ
- ์ค์ ๋ก ์ฝ๋๊ฐ ๋์ด์ฌ๋ ค์ง๋ ๊ฑด ์๋๋ฉฐ, js parser ๋ด์ฃผ๋ณ์ผ๋ก ๋์ด์ฌ๋ ค์ ์ฒ๋ฆฌ
- ์ค์ ๋ฉ๋ชจ๋ฆฌ์์๋ ๋ณํ๊ฐ ์์
ํธ์ด์คํ ์ ํ๊ธฐ์ ์๋ฉด ์ข์ ๊ฒ
js์์ง์์ ๋ณ์ ์์ฑ ๋จ๊ณ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ๋ณ์๋ ์ ์ธ → ์ด๊ธฐํ → ํ ๋น์ ๊ฑฐ์ณ ์์ฑ๋จ
์ ์ธ ๋จ๊ณ | ๋ณ์๋ฅผ ์คํ ์ปจํ ์คํธ(์คํ ์ฝ๋์ ์ ๊ณตํ ์ ๋ณด ๊ฐ์ฒด)์ ๋ณ์ ๊ฐ์ฒด์ ๋ฑ๋กํ๋ค. |
์ด๊ธฐํ ๋จ๊ณ | ๋ณ์ ๊ฐ์ฒด์ ๋ฑ๋ก๋ ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ค. (์ด๋, undefined๋ก ์ด๊ธฐํ๋จ) ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ํตํด ๋ณ์์ ์ ๊ทผํ ์ ์๋ค. |
ํ ๋น ๋จ๊ณ | ์ฌ์ฉ์๊ฐ ์ ์ํ ๊ฐ์ ๋ณ์์ ํ ๋นํด์ค๋ค. |
์๋ฐ ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์คํ ์ปจํ ์คํธ์ ๋ฑ๋ก๋ ๋ณ์ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
var์ ๊ฒฝ์ฐ ๋ณ์ ์ ์ธ&์ด๊ธฐํ๊ฐ ํจ๊ป ์งํ๋๋ฏ๋ก, ๋ณ์ ๊ฐ์ฒด ๋ฑ๋ก๊ณผ ๋์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๋ ํ ๋น ๋ฐ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ํ์ด๋ฏ๋ก ํธ์ด์คํ ์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ํตํด ๋ณ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
console.log(a); // ๋ณ์ ์ ๊ทผ ๊ฐ๋ฅ -> undefined
var a; // ์คํ ์ปจํ
์คํธ์ ๋ฑ๋ก & ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ์
console.log(a); // ๋ณ์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ -> error
let a; // ์คํ ์ปจํ
์คํธ์ ๋ฑ๋ก & ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ชป ๋ฐ์
ํธ์ด์คํ ๋์
var ๋ณ์ ์ ์ธ๊ณผ ํจ์ ์ ์ธ๋ฌธ์์๋ง ํธ์ด์คํ ์ด ์ผ์ด๋จ
- var ๋ณ์/ํจ์์ ์ ์ธ๋ง ์๋ก ๋์ด ์ฌ๋ ค์ง๋ฉฐ, ํ ๋น์ ๋์ด ์ฌ๋ ค์ง์ง ์์
- let/const ๋ณ์ ์ ์ธ๊ณผ ํจ์ํํ์์์๋ ํธ์ด์คํ
์ด ๋ฐ์ํ์ง ์์
ํธ์ด์คํ
์ ์ด๊ธฐํ๊น์ง ํฌํจํ์ง ์๊ณ , ์ธ์ ์ค์ฝํ ์๋จ์์ ์ ์ธ๋ถ๋ฅผ ๊ด์ธกํ ์ ์๋ ํ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค๋ฉด
var, function ํค์๋ ๋ฟ๋ง ์๋๋ผ let๊ณผ const ๋ํ ํธ์ด์คํ
์ ๋์์ผ๋ก ๋ณผ ์ ์์
(์ด๊ธฐํ๊น์ง ์น๋ฉด ์๋์ง๋ง let๊ณผ const๋ ์ ์ธํ๊ฑฐ๊น์ง ์๋ณํ๋๊น ์ฌ๊ธฐ๊น์ง ํธ์ด์คํ
์ด๋ผ ๋ด์ผํ๋๊ฐ๋ ์ฌ๋๋ง๋ค ์ข ๋ค๋ฅธ๊ฒ ๊ฐ์ ์๋ณํด์ ์๋ฌ๋ฅผ ๋งํด์ฃผ๋๊น)
ํธ์ด์คํ ๊ท์น
- ์ ์ธ๋ ํจ์๋ ์๋จ์์ ์ฐธ์กฐ, ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
- ์ ์ธ๋ var ๋ ์๋จ์์ ์ฐธ์กฐ, ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
- ์ ์ธ๋ let , const ๋ ์๋จ์์ ์ฐธ์กฐ, ํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค.
var๋ก ์ ์ธํ ๋ณ์๋ ํธ์ด์คํ ์ undefined๋ก ๋ณ์๋ฅผ ์ด๊ธฐํ
์ ์ธ ์ด์ ์ ์ฌ์ฉํ๋ ค๊ณ ํ์ ๋ var๋ก ์ ์ธํ ๋ณ์๋ undefined๊ฐ ์ถ๋ ฅ
์ ์ธ ์ดํ์ ์ฌ์ฉํ๋ฉด ์ ์ธํ ๊ฐ์ด ํ ๋น๋์ด์ ์ฌ์ฉ
๋ฐ๋ฉด let๊ณผ const๋ก ์ ์ธํ ๋ณ์๋ ํธ์ด์คํ ์ ๋ณ์๋ฅผ ์ด๊ธฐํํ์ง ์์
let,const๋ก ์ ์ธํ ๋ณ์๋ ์๋ฌ๊ฐ ๋ธ
console.log(a) // undefiend var์ฌ์ ํธ์ด์คํ
๋ฌ์ง๋ง undefiend๋ก ์ด๊ธฐํ ์ํ
var a = 1;
console.log(a) // 1 1๋ก ์ด๊ธฐํ ์ํ
console.log(b) // Uncaught ReferenceError: b is not defined
let b = 1;
console.log(c); // ReferenceError
const c = '1';
print() // d
function print() {
console.log('d')
}
print2() // error
const print2 = () => {
console.log('e')
}
๊ทธ๋์ ์์ฆ์ var๋ฅผ ์์ฐ๊ณ let๊ณผ const๋ฅผ ์ฌ์ฉ ํ๋ ์ด์ ๋
๋ณ์ ํ ๋น์ ์ค๋ฅ๋ฅผ ๋ฐ๋ก ์์ ์๊ณ (์ค๋ฅ๋ฐ์์ด ๋ณด์ด๋๊น)
var๋ ์ ์ธ ์ ์ฌ์ฉ๊ฐ๋ฅํด์ ์ดํ์ ์ฌํ ๋น๋๋ฉด ๊ฐ์ด ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ฉํ์ง ์์
ํจ์ ํธ์ด์คํ
ํจ์ ํธ์ด์คํ ์ด ๊ฐ์ฅ ๋จผ์ ์ด๋ฃจ์ด์ง
ํจ์ ์ ์ธ์ ํธ์ด์คํ ์ด ์ด๋ฃจ์ด์ ธ ํจ์ ๋ณด๋ค ์์์ ์คํํด๋ ์๋๋จ
BUT ํจ์ ํํ์์ ํธ์คํ ๋์ง ์์ ํจ์ ์์์ ์คํ์ ์๋ฌ ๋ฐ์
ํจ์์ ์ธ์ด๋
// ํจ์ ์ ์ธ์์ด๋
function calcRectArea(width, height) {
return width * height;
}
console.log(calcRectArea(5, 6));
// expected output: 30
// ์ ์ธ์ ํธ์ด์คํ
๊ฐ๋ฅ
print() // a
function print() {
console.log('a')
}
ํจ์ํํ์์ด๋
// ํจ์ ํํ์์ด๋
const getRectArea = function(width, height) {
return width * height;
};
console.log(getRectArea(3, 4));
// expected output: 12
// ํํ์์ ํธ์ด์คํ
์๋์ ์๋ฌ๋จ
print() // error
const print = () => {
console.log('a')
}
๊ฒฐ๋ก
- ์ ์ธ๋ ํจ์๋ ์ ์ธ๋ฌธ ์๋จ์์ ์ฐธ์กฐ, ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
- var๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ธ๋ฌธ ์๋จ์์ ์ฐธ์กฐ, ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
- let, const๋ก ์ ์ธ๋ ๋ณ์๋ ์๋จ์์ ์ฐธ์กฐ, ํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋๋๋ก var๋ฅผ ์ฌ์ฉ๋ง๊ณ let, const๋ฅผ ์ฌ์ฉ
๋ณ์๋ ํจ์๋ ์ ์ธํ๊ณ ์ฌ์ฉํ์
์ค์ฝํ
์ค์ฝํ๋, ๋ณ์์ ์ ๊ทผํ ์ ์๋ ๋ฒ์
์๋ณ์ ์ ๊ทผ ๊ท์น์ ๋ฐ๋ฅธ ์ ํจ ๋ฒ์
์ค์ฝํ์ ์ฃผ์ ๊ท์น
1. ์์ชฝ ์ค์ฝํ์์ ๋ฐ๊นฅ์ชฝ ์ค์ฝํ๋ก ์ ๊ทผํ ์ ์์ง๋ง, ๋ฐ๋๋ ๋ถ๊ฐ๋ฅ
- ๋ฐ๊นฅ์ชฝ ์ค์ฝํ์์ ์ ์ธํ ์๋ณ์๋ ์์ชฝ์ค์ฝํ์์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ฐ๋๋ก ์์ชฝ ์ค์ฝํ์์ ์ ์ธํ ์๋ณ์๋ ๋ฐ๊นฅ์ชฝ์์ ์ฌ์ฉ ํ ์ ์๋ค.
2. ์ค์ฝํ๋ ์ค์ฒฉ์ด ๊ฐ๋ฅํจ
- ํจ์์์ ํจ์์์ ํจ์ ์ฒ๋ผ ๊ฐ์ฅ์์ชฝ ํจ์์์ ๊ฐ์ฅ ๋ฐ๊นฅ ํจ์์ ์๋ณ์ ์ฌ์ฉ์ด ๊ฐ๋ฅ(์ค์ฒฉ)
3. ์ง์ญ๋ณ์๋ ์ ์ญ๋ณ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ ๋์
- ์ ์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์ ์ญ ๋ณ์์ด๋ค.
- ์ง์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์ง์ญ ๋ณ์์ด๋ค.
- ์ง์ญ ๋ณ์๋ ์ ์ญ ๋ณ์๋ณด๋ค ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ค.
์ค์ฝํ์ 2๊ฐ์ง ํ์
- ์ ์ญ์ค์ฝํ(global)
- ์ง์ญ์ค์ฝํ(local)
์ ์ญ์ค์ฝํ
์ ์ญ์ ์ ์ธ๋์ด์์ด ์ด๋ ๊ณณ์์๋ ์ง ํด๋น ๋ณ์์ ์ ๊ทผํ ์ ์์
์ง์ญ์ค์ฝํ
ํด๋น ์ง์ญ์์๋ง ์ ๊ทผํ ์ ์์ด ์ง์ญ์ ๋ฒ์ด๋ ๊ณณ์์ ์ ๊ทผํ ์ ์์
ex)ํจ์์ค์ฝํ, ๋ธ๋ก์ค์ฝํ
ํจ์์ค์ฝํ
ํจ์๋ฅผ ์ ์ธํ๋ฉด ํจ์๋ฅผ ์ ์ธ ํ ๋๋ง๋ค ์๋ก์ด ์ค์ฝํ๋ฅผ ์์ฑํจ์ ๋ชธ์ฒด์ ์ ์ธํ ๋ณ์๋ ํด๋น ํจ์ ๋ชธ์ฒด ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
var a = 1; // ์ ์ญ ์ค์ฝํ
function print() { // ์ง์ญ(ํจ์) ์ค์ฝํ
var a = 111;
console.log(a);
}
print(); // 111
console.log(a); // 1
ํจ์์์์ a = 111์ด๋ผ๋ ๋ณ์๋ฅผ ํ ๋นํด์ ์ฝ์์ ์ฐ๊ณ ํจ์๋ ์ฌ๋ช ์ ๋คํจ(ํจ์ ๋ด ์ง์ญ์์๋ง ์ ํจํจ)
var a = 1; // ์ ์ญ ์ค์ฝํ
function print() { // ํจ์ ์ค์ฝํ
console.log(a);
}
print(); // 1
ํจ์์์์ a๋ฅผ ๋ฐ๋ก ํ ๋นํด์ฃผ์ง ์์์ง๋ง, ์ง์ญ์ค์ฝํ๋ด ํ ๋น์ด ์์ผ๋ฉด ์ค์ฝํ ์ฒด์ธ์ ํตํด ์ ์ญ์ค์ฝํ์์ ๋ณ์๋ฅผ ์ฐพ์
๋ธ๋ก ์ค์ฝํ
{ } ์ค๊ดํธ๋ก ๋๋ฌ์ธ์ธ ๋ถ๋ถ์ ๋ธ๋ก
์ค์ฝํ์ var, let, const
const
์ ํจ๋ฒ์ : ๋ธ๋ก์ค์ฝํ / ํจ์์ค์ฝํ
๊ฐ ์ฌํ ๋น : ๋ถ๊ฐ๋ฅ
์ฌ์ ์ธ : ๋ถ๊ฐ๋ฅ
let
์ ํจ๋ฒ์ : ๋ธ๋ก์ค์ฝํ / ํจ์์ค์ฝํ
๊ฐ ์ฌํ ๋น : ๊ฐ๋ฅ
์ฌ์ ์ธ : ๋ถ๊ฐ๋ฅ
var
์ ํจ๋ฒ์ : ํจ์์ค์ฝํ
๊ฐ ์ฌํ ๋น : ๊ฐ๋ฅ
์ฌ์ ์ธ : ๊ฐ๋ฅ
for(let i=0; i<10; i++) { // let์ฌ์ฉ
console.log(i); //0,1,2,3,4,...
}
// ์ ์ญ์ค์ฝํ์์ ์ ์ธํ ๋ณ์ i ๋ ์กด์ฌํ์ง ์์์ผ๋ก ์๋์์ ReferenceErrer์ ์ผ์ผํจ๋ค.
console.log(i); // ReferenceErrer
๋ธ๋ก ์ค์ฝํ ์์์ let๊ณผ const ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ์ค์ฝํ ์์์๋ง ์ฐธ์กฐ ๊ฐ๋ฅํ๋ค.
for(var i=0; i<10; i++) { // var ์ฌ์ฉ
console.log(i);
}
// var ํค์๋๋ก ์ ์ธํ ๋ณ์ i ๋ ์ง์ญ ์ค์ฝํ์์ ์ ์ธ๋์์ง๋ง ๋ชจ๋ ์ค์ฝํ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
console.log(i); // 9
var ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฌด์ํ๊ณ ์ค์ฝํ ์ธํ๋ฆฌ ๋ฐ์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. (var๋ Only ํจ์ ์ค์ฝํ๋ง ๋ฐ๋ฅธ๋ค.)
๊ทธ๋ฌ๋ ๋ธ๋ก ๋จ์๋ก ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ์ ๋, ํจ์ฌ ๋ ์์ธก ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก let ํค์๋์ ์ฌ์ฉ์ ๊ถ์ฅ
๋ณ์ ์ ์ธ์ ์ฃผ์์
์ ์ญ๊ฐ์ฒด(window)
Window ๊ฐ์ฒด๋ only ๋ธ๋ผ์ฐ์ ์๋ง ์กด์ฌํ๋ ๊ฐ์ฒด
๋ธ๋ผ์ฐ์ ์ ์ฐฝ(window)๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด
๊ทธ๋ฐ๋ฐ ๋ณ๊ฐ๋ก ์ ์ญ ์์ญ์ ๋ด๊ณ ์์
๊ทธ๋์ ํจ์ ์ ์ธ์์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๊ฑฐ๋ var ํค์๋๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด window ๊ฐ์ฒด์ ์ํจ
์ ์ญ๋ณ์๋ ์ต์ํํ๋ ๊ฒ์ด ์ข์
- ๊ฐ์ฅ ๋ฐ๊นฅ ์ค์ฝํ์ ์ ์ํ ๋ณ์๊ฐ ์ ์ญ๋ณ์
- ์ด๋์๋ ์ ๊ทผ ๊ฐ๋ฅ
- ์ ์ญ๋ณ์๋ฅผ ์ต์ํ ํ๋ฉด ์๋์น ์์ ๋ก์ง์ ์ํ ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์์
- ํนํ ์ ์ธ ์์ด ์ ์ธํ๋ฉด var๋ก ์ ์ธ ํ๊ฒ์ฒ๋ผ ์ทจ๊ธ(๊ทธ๋ผ ์ฌ๊ธฐ์ ๊ธฐ์ ๊ณ์ ๋ฐ๋ ์ ์์) ์ฃผ์
TDZ(Temporal Dead Zone)
์ผ์์ ์ธ ์ฌ๊ฐ์ง๋๋ ๋ป
์ผ์์ ์ธ ์ฌ๊ฐ์ง๋๋ ์ค์ฝํ์ ์์ ์ง์ ๋ถํฐ ์ด๊ธฐํ ์์ ์ง์ ๊น์ง์ ๊ตฌ๊ฐ
๋ณ์ ์ ์ธ 3๋จ๊ณ
1. ์ ์ธ ๋จ๊ณ(Declaration phase)
๋ณ์๋ฅผ ์คํ ์ปจํ ์คํธ์ ๋ณ์ ๊ฐ์ฒด์ ๋ฑ๋กํ๋ ๋จ๊ณ. ์ด ๋ณ์ ๊ฐ์ฒด๋ ์ค์ฝํ๊ฐ ์ฐธ์กฐํ๋ ๋์
2. ์ด๊ธฐํ ๋จ๊ณ(Initialization phase)
์คํ ์ปจํ ์คํธ์ ์กด์ฌ ํ๋ ๋ณ์ ๊ฐ์ฒด์ ์ ์ธ ๋จ๊ณ์ ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๋๋ ๋จ๊ณ. ์ด ๋จ๊ณ์์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์๋ undefined๋ก ์ด๊ธฐํ
3. ํ ๋น ๋จ๊ณ(Assignment phase)
์ฌ์ฉ์๊ฐ undefined๋ก ์ด๊ธฐํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ๊ฐ์ ํ ๋นํ๋ ๋จ๊ณ.
์ ํธ์ด์คํ ์์ ๋งํ์ง๋ง, var ํค์๋ ๋ณ์๋ ๋ณ์ ์ ์ธ์ ์ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๋ฅผ ๋์์ ์งํ
๋๋ฌธ์ ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ ์ ์ ํธ์ถ์ ํด๋ undefined๋ก ํธ์ถ์ด ๋๋ ํธ์ด์คํ ์ด ๋ฐ์
let, const๋ ์ ์ธ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋ถ๋ฆฌ๋์ด์ ์งํ
๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น์ด ๋์ง ์์ ์ ๊ทผํ ์ ์์ด ์ฐธ์กฐ ์๋ฌ(ReferenceError)๊ฐ ๋ฐ์
TDZ์ ์ํฅ์ ๋ฐ๋ ๊ตฌ๋ฌธ
let, const, class
์ ์ธ๊ฐ๋ ํญ์ ๋ณ์๋ฅผ ์ ์ธ ํ ์ฌ์ฉํด์ผํจ(์๊ทธ๋ฌ๋ฉด ์๋ฌ๋จ)
// Does not work!
console.log(cat) // error : ReferenceError
const cat = "์ผ์น"
count; // throws `ReferenceError`
let count = 10;
const myNissan = new Car('red'); // throws `ReferenceError`
class Car {
constructor(color) {
this.color = color;
}
}
------
// Works!
const cat = "์ผ์น"
console.log(cat) // "์ผ์น"
let count = 10;
count; // 10
class Car {
constructor(color) {
this.color = color;
}
}
const myNissan = new Car('red');
myNissan.color; // 'red'
TDZ์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ตฌ๋ฌธ
var, funtion, import
๋ฐ์์ ์ ์ธ ํ๋๋ผ๋ ํธ์ด์คํ ๋์ด ์์์ ์ฌ์ฉํด๋ ์ ์ ์คํ
// Works!
value; // undefined
var value;
hello('Shin') // "Hello Shin :)"
function hello (name) {
return `Hello ${name} :)`
}
hello('Shin') // "Hello Shin :)"
์คํ ์ปจํ ์คํธ
์คํ ์ปจํ ์คํธ๋, ์คํ ์ฝ๋์ ์ ๊ณตํ ์ ๋ณด๋ค์ ๋ชจ์ ๋์ ๊ฐ์ฒด
JS ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋์ ๋ํ ์ ๋ณด๋ค(๋ณ์, arguments ๊ฐ์ฒด, ํจ์ ์ ์ธ, scope, this ๋ฑ)์ ์๊ณ ์์ด์ผ ํจ
JS ์ฝ๋๊ฐ ์คํ๋๋ฉด์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋์ ๋ํ ์ ๋ณด๋ค์ ์คํ ์ปจํ ์คํธ ๊ฐ์ฒด ์์ ์ ์ฅํจ
์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ์ ๋ณด๋ค์ ๊ฐ์ง ๋ฒ์๋ฅผ ์ถ์ํํ๊ธฐ ์ํด ๊ฐ์ฒด ํํ๋ก ๋ํ๋ธ ๊ฒ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์์ฑ๋ ์คํ ์ปจํ ์คํธ๋ ๋ ผ๋ฆฌ์ ์คํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง
์คํ๋๋ ์์๋๋ก ์ฝ ์คํ(call stack)์ ์์๋ค๊ฐ, ๊ฐ์ฅ ์์ ์์ฌ์๋ ์ปจํ ์คํธ์ ๊ด๋ จ ์๋ ์ฝ๋๋ค์ ์คํํ๋ ์์ผ๋ก ๋์ผํ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅ
์คํ์ LIFO(Last In First Out, ํ์ ์ ์ถ) ๊ตฌ์กฐ์ ์๋ฃ ๊ตฌ์กฐ
์คํ ์ปจํ ์คํธ๊ฐ ์๊ธฐ๋ ์์
1. ์ ์ญ๊ณต๊ฐ
=> JS ์ฝ๋๊ฐ ์ฒ์์ผ๋ก ์คํ๋ ๋
2. eval ํจ์ ์ฌ์ฉ ์
(๋ณด์์ ์ทจ์ฝ์ ์ด ์๊ณ , ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ฉ ์ํ๊ณ ์ง์ํ๋ ๋ฐฉ๋ฒ)
3. ํจ์ ์ฌ์ฉ ์
=> anonymous func() ์คํ
4. { } ์ฝ๋ ๋ธ๋ญ ์ฌ์ฉ ์
// ------------------------ (1)
var a = 1;
function outer() {
function inner() {
console.log(a);
var a = 3;
// ------------------ (2)
}
inner(); // ------------ (3)
console.log(a);
// --------------------- (4)
}
outer(); // --------------- (5)
console.log(a);
// ------------------------ (6)
์ ์ฝ๋๊ฐ ์คํ ๋๋ ์์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ์์๋ ์คํ์ ์ํ ์คํ ์ปจํ ์คํธ์ ์ ๋ณด๋ค์ ์๋์ ๊ฐ์ด ์คํ์ ๋จผ์ ์๊ฒ ๋จ
์ฝ๋ ์คํ์ ์คํ์ด ์ด๋ป๊ฒ ์์ด๋์ง ์์๋ณด์
์ฝ๋ ์คํ์ ์ ์ญ ์ปจํ ์คํธ๊ฐ ์์ฑ ๋๊ณ outer() ํจ์๊ฐ ์คํ๋๋ค.
outer์์ innerํจ์๊ฐ ์คํ๋์ด ๋ง์ง๋ง์ผ๋ก ์คํ์ ์์ด๊ณ inner ํจ์๊ฐ ๋จผ์ ์คํ๋์ด ๊ฐ์ฅ ๋จผ์ ์คํ์์ ๋น ์ง๋ค.
๊ทธ๋ค์ outer ํจ์๊ฐ ๋น ์ง๊ณ , ์ ์ญ ์ปจํ ์คํธ๊ฐ ๋น ์ง๋ฉด์ ์คํ์ ์ปจํ ์คํธ๋ค์ด ์์ด์ง๊ฒ ๋จ
โป ์ฐธ๊ณ ) ์คํ ์ปจํ ์คํธ ๊ฐ์ฒด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์ฉํ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฐ์ฒด
๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ํตํด์ ์คํ ์ปจํ ์คํธ์ ์ ๊ทผํ ์๋ ์์
์คํ ์ปจํ ์คํธ์ ๊ตฌ์กฐ
1. Variable Environment
2. Lexical Environment
3. thisBinding
Variable Environment ์ Lexical Environment ์ ๋ด๋ถ์๋ envrionmentRecord ์ outerEnvironmentReference ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๋ถ๋ถ์์ ๋์ผ
Variable Environment ๋ ์ต์ด์ ์ค๋ ์ท์ ๊ฐ๋ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ปจํ ์คํธ ์ ๋ณด์ ๋ํด ์ ๋ฐ์ดํธ๋ฅผ ํ์ง ์์
Variable Environment
- var๋ก ์ ์ธ๋ ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋๊ณ ์ด๊ธฐ๊ฐ์ผ๋ก undefined๊ฐ ํ ๋น
- ์ต์ด ์คํ ์์ ์ค๋ ์ท์ ์ ์ง
Lexical Environment
- let, const๋ก ์ ์ธ๋ ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋๊ณ ์ด๊ธฐ๊ฐ์ ํ ๋น๋์ง ์์
- ํจ์ ์ ์ธ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋๊ณ ํจ์ ์ ์ฒด๊ฐ ํ ๋น
- let๊ณผ const๋ก ์ ์ธํ ๋ณ์๋ฅผ ์ํ Block scope๋ฅผ ๋จ์๋ก ํจ
๊ฐ ์คํ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฒ์๋ฅผ Scope ์ด๋ผ๊ณ ํ๋ค๋ฉด, ํ์ฌ Scope์์ ์ ์ธ๋์ง ์๋ ๋ณ์๋ฅผ ํธ์ถ ํ๋ค๋ฉด ์์์์ ์ฐพ์ ์ ์๋๋ก outerEnvironmentReference ๊ฐ ์ค์ฝํ์ฒด์ธ์ ๊ตฌ์ฑํ ์ ์๋๋ก ์ฃผ์๋ฅผ ์ฐธ์กฐํจ
envrionmentRecord
- ํด๋น Lexical Environment/Variable Environment์ scope ์์์ ์์ฑ๋ ๋ณ์, ๋งค๊ฐ๋ณ์, ํจ์(ํจ์ ํํ์์ ์ ์ธ) ๋ฑ์ ์๋ณ์(Identifier) ์ ๋ณด๋ค์ ์ ์ฅ
- ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋น ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์์๋๋ก ์ฝ์ผ๋ฉฐ ์๋ณ์ ์ ๋ณด๋ฅผ ์์ง
- ์ ์ญ ์คํ ์ปจํ ์คํธ์ ๊ฒฝ์ฐ ์ ์ญ ๊ฐ์ฒด(Global Object: window or global) ์์ ์ ์ ๋ณด๋ค์ ์ ์ฅ
- ํธ์ด์คํ ์ด ๋ฐ์
Environment Record ์ ๋ณด๋ฅผ ์์งํ๋ ๊ฒ์ ํตํด์, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋น ์ปจํ ์คํธ์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์๋ ์ฝ๋์ ์๋ณ์๋ค์ ๋ชจ๋ ๋ค ์ ์ ์๊ฒ ๋จ(ํธ์ด์คํ )
ThisBingding ๊ฐ์ ํฌํจํจ
function a (x) {
console.log(x);
var a = 1;
var b = 2;
function foo() {
console.log('work');
};
}
a(1);
์์ ์ฝ๋์์, ์คํ ์ปจํ ์คํธ์ EnvironmentRecord์๋ ์๋ณ์ x, a, b์ ํจ์ foo๊ฐ ์์ง
EnvironmentRecord๋ ํ์ฌ ์คํ๋ ์ปจํ ์คํธ์ ๋์ ์ฝ๋ ๋ด์ ์ด๋ค ์๋ณ์๋ค์ด ์๋์ง๋ง์ ๋จผ์ ์์งํ๊ธฐ ๋๋ฌธ์, ๋ณ์๋ฅผ ์ธ์ํ ๋ ์๋ณ์๋ง ๋์ด์ฌ๋ฆฌ๊ณ ํ ๋น ๊ณผ์ ์ ์๋ ์๋ฆฌ์ ์์๋๋ก ๋จ๊ฒจ๋ (ํธ์ด์คํ ๊ฐ๋ )
outerEnvironmentReference
Lexical scope(or static scope)๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ scope์ Lexical Environment๋ฅผ ์ฐธ์กฐ
์ฆ, ํธ์ถ๋๋ฉด์ ํ์ฌ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ํจ์๊ฐ ์ ์ธ๋ ๋น์ ์ปจํ ์คํธ์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
ํธ์ถ๋ ํจ์๊ฐ ์ ์ธ๋ ๋น์์ Lexical Environment๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ๋ก, ์ค์ฝํ ์ฒด์ธ์ ๊ฐ๋ฅํ๊ฒ ํจ
์ค์ฝํ์ ์ค์ฝํ์ฒด์ธ์ด ํ์ฑ
scope chain
- ์๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ์์์ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก ๊ฒ์ํด๋๋ ๊ฒ
- ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด outerEnvironmentReference์ด๋ค.
thisBinding
ํ์ฌ ์ด ์ปจํ ์คํธ๊ฐ ์ด๋ค this ๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ์๋์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์
์คํ ์ปจํ ์คํธ๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์๊ธฐ๊ณ ์คํ ์ปจํ ์คํธ๊ฐ ์๊ธธ ๋ this ๊ฐ์ด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์, this ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋จ. ์ฆ, ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ this ๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋จ
๊ธฐ๋ณธ์ ์ผ๋ก this ๋ฅผ ๋ช ์ํ์ง ์์ผ๋ฉด ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋จ
js์ this๋ ์์ด ๋ฐฉ๋ํ๊ธฐ ๋๋ฌธ์ ๋์ค์ ์์ธํ ๊ธฐ๋ก ์์
์ฝ ์คํ(ํธ์ถ ์คํ)
ํธ์ถ ์คํ์ด๋, ํ๋ก๊ทธ๋จ์์ ์ฐ๋ฆฌ๊ฐ ์ด๋์ ์๋์ง๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋กํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
ํจ์๋ฅผ ์คํํ๋ฉด ํด๋น ํจ์์ ๊ธฐ๋ก์ ์คํ ๋งจ ์์ ์ถ๊ฐ(Push)
์ฐ๋ฆฌ๊ฐ ํจ์๋ฅผ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ฉด ์คํ์ ์์ฌ์๋ ํจ์๋ ์ ๊ฑฐ(Pop)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ฏ๋ก, ๋จ์ผ ํธ์ถ ์คํ์ ๊ฐ์ง๊ณ ์์
๋จ์ผ ํธ์ถ ์คํ์ด ์๋ค๋ ๋ป์ ํ ๋ฒ์ ํ๋์ ์ผ(Task)๋ง ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ป
function multiply(x, y) {
return x * y;
}
function printSquare(x) {
var s = multiply(x, x);
console.log(s);
}
printSquare(5);
์์ง์ด ์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์๋ ํธ์ถ ์คํ์ด ๋น์ด์๋ค.
๊ฐ์ฅ ์๋ซ์ค์ printSquare ํจ์๊ฐ ์คํ๋๋ฉด ์ดํ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์คํ ์ค๋ฒํ๋ก์ฐ
์คํ์ ์ฌ์ด์ฆ๋ฅผ ์ด๊ณผ ํ์ ๋ ๋ฐ์ํ๋ ์ค๋ฅ(ํนํ ์ฌ๊ท๋ฅผ ํธ์ถํ ๋ ๋ง์ด ๋์ด)
function foo() {
foo();
}
foo();
ํธ์ถ ์คํ์ ํจ์ ํธ์ถ ์๊ฐ ํธ์ถ ์คํ์ ์ค์ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๊ฒ ๋๊ณ , ๋ธ๋ผ์ฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ผ๋ก ํจ์๋ฅผ ์ข ๋ฃ
์๋ฐ์คํฌ๋ฆฝํธ - ์ฑ๊ธ ์ฐ๋ ๋ ์ธ์ด
์ฆ, ํ ๋ฒ์ ํ ๊ฐ์ง ์ผ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธ(like, ๋ฉํฐ ํ ์คํน์ด ์๋๋ ์ฌ๋)
๋จ์ผ ํธ์ถ ์คํ์ ๋ฌธ์ ์
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํ๋์ ํธ์ถ ์คํ๋ง ์๊ธฐ ๋๋ฌธ์, ํ๋์ ํจ์ ์ฒ๋ฆฌ๊ฐ ์์ฒญ ๋๋ ค์ ๋ค๋ฅธ ํจ์ ์คํ์ ์ง์ฅ์ ์ค๋ค๋ฉด?
์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ์์ ๋ณต์กํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ค๊ณ ์๊ฐํด๋ณด์. ์์ ๋ฐฐ์ด ํธ์ถ ์คํ์ ๋์ ๋ฐฉ์์ ์๊ฐ ํด๋ณผ ๋, ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์คํ์ ์ฐจ์งํ๊ณ ์์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์ ์์ ๋ค์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฆ, ํ์ฌ ์คํํ๊ณ ์๋ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ์ผ์ ํ ์๊ฐ ์๊ณ , ๋ค๋ฅธ ์ผ๋ค์ด ๋ธ๋ฝ๋๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด ์คํ๋ ๊ฒฝ์ฐ, ์น ํ์ด์ง์ UI๋ ๋ฉ์ถฐ๋ฒ๋ฆฌ๊ณ , ์ฌ์ฉ์๋ ์ด๋ ํ ํ๋๋ ํ ์ ์๋ค.
๋ํ, ๋ธ๋ผ์ฐ์ ๊ฐ ํธ์ถ ์คํ์์ ๋ง์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์์ํ๋ฉด ๊ฝค ์ค๋ ์๊ฐ ๋์ ์๋ต์ ๋ฉ์ถ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๋ ์ด ์ํฉ์์ ์น ํ์ด์ง๋ฅผ ์ข ๋ฃํ ์ง ์ฌ๋ถ๋ฅผ ๋ฌป๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์
ํด๊ฒฐ๋ฐฉ๋ฒ
๋น๋๊ธฐ ์ฝ๋ฐฑ(Asynchronous callbacks)
์ฐ๋ฆฌ์ ์ฝ๋ ์ผ๋ถ๋ฅผ ์คํํ๊ณ ๋์ค์ ์คํ๋ ์ฝ๋ฐฑ(ํจ์)๋ฅผ ์ ๊ณต
๋น๋๊ธฐ ์ฝ๋ฐฑ์ ์ฆ์๊ฐ ์๋, ํน์ํ ์์ ์ ์คํ๋๋ฏ๋ก console.log์ ๊ฐ์ ๋๊ธฐ ํจ์์๋ ๋ค๋ฅด๊ฒ ์คํ ์์ ๋ฐ๋ก push ๋ ํ์๊ฐ ์์
์ด๋ฒคํธ ํ(Event Queue)์ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ์ฒ๋ฆฌ ๊ณผ์
์๋ฐ์คํฌ๋ฆฝํธ ์คํํ๊ฒฝ(Runtime)์ ์ด๋ฒคํธ ํ(Event Queue)๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด๋ ์ฒ๋ฆฌํ ๋ฉ์์ง ๋ชฉ๋ก๊ณผ ์คํํ ์ฝ๋ฐฑ ํจ์ ๋ค์ ๋ฆฌ์คํธ
๋น๋๊ธฐ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ณผ์
1. ์ฐ์ ๋ฒํผ ํด๋ฆญ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด DOM ์ด๋ฒคํธ, http ์์ฒญ, setTimeout ๋ฑ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ํจ์๋ C++๋ก ๊ตฌํ๋ web API๋ฅผ ํธ์ถํ๋ฉฐ,
2. web API๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด๋ฒคํธ ํ(์ฝ๋ฐฑ ํ)์ ๋ฐ์ด ๋ฃ์ต๋๋ค.
3. ๊ทธ๋ผ ์ด๋ฒคํธ ํ๋ ๋๊ธฐํ๋ค๊ฐ ์คํ์ด ํ ๋น๋ ์์ ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋๋ฆฌ๊ฒ ๋ฉ๋๋ค(์คํ์ ๋ฃ์).
4. ์ด๋ฒคํธ ๋ฃจํ์ ๊ธฐ๋ณธ ์ญํ ์ ํ์ ์คํ, ๋ ๋ถ๋ถ์ ์ง์ผ๋ณด๋ค๊ฐ ์คํ์ด ๋น๋ ์์ ์ ์ฝ๋ฐฑ์ ์คํ์์ผ ์ฃผ๋ ๊ฒ. ๊ฐ ๋ฉ์์ง์ ์ฝ๋ฐฑ์ ๋ค๋ฅธ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์์ ํ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์๋ํ
์๋ํ๋, ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด ์๋๋ ๋ณ์์ ๋ํ ์ ๊ทผ์ ๋ง๋ ๊ฒ(์์ ์ ์ผ๋ก ๊ด๋ฆฌ)
๊ฐ์ฒด ๊ฐ์ ์ํธ ์์กด์ฑ, ์ฆ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ํจ๊ณผ
ํจ์๋ฅผ ํตํด ๋ณ์์ ๋ํ ์ ๊ทผ์ ์๋ํ
(function () {
var a = 'a';
})();
console.log(a); // a is not defined
๐ค ์ค์ต ๊ณผ์
์ฝ์์ ์ฐํ b ๊ฐ์ ์์ํด๋ณด๊ณ , ์ด๋์์ ์ ์ธ๋ “b”๊ฐ ๋ช๋ฒ์งธ ๋ผ์ธ์์ ํธ์ถํ console.log์ ์ฐํ๋์ง,
์ ๊ทธ๋ฐ์ง ์ค๋ช ํด๋ณด์ธ์. ์ฃผ์์ ํ์ด๋ณด๊ณ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด ์ ์ค๋ฅ๊ฐ ๋๋ ์ง ์ค๋ช ํ๊ณ ์ค๋ฅ๋ฅผ ์์ ํด๋ณด์ธ์.
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b);
}
// console.log(a); // Uncaught ReferenceError: a is not defined
console.log(b); // 1
hi(); // 1,101
console.log(b); // 101
------
// ์ฒซ์ค์์ let์ผ๋ก b๋ 1์ด๋ผ๊ณ ํ ๋น(์ ์๋ฐ ์ด๊ธฐํ) ํด์ฃผ์๊ณ
// hiํจ์ ์์์ a, b๋ฅผ 1๊ณผ 100์ผ๋ก ์ฌ ์ ์ธ๋ฐ ์ด๊ธฐํ ํด์ฃผ์๋ค
// ๊ทธํ b++๋ก 100์ 1์ ๋ํ ๊ฐ์ด b๊ฐ ๋์์ง๋ง
// ์ด๋ ํจ์ ์์์ ๋ฒ์ด์ง ์ผ ๋ฐ์ ์ํฅ์ ์์ง ์ฃผ์ง ์์๋ค
// console.log(a)๋ ํจ์ ์์์๋ ์ ์ธ ๋ฐ ์ด๊ธฐํ๊ฐ ๋์์ง๋ง,
// ์์ง ํจ์ ์คํ ์ ์ด๋ผ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
// console.log(b)๋ ์ฒ์์ ํ ๋นํ b=1์ด ๋ ๊ฒ์ด๊ณ
// hi ํจ์ ๋ฅผ ์คํ ํ๋ฉด์ a,b๊ฐ ์ ์ธ ๋ฐ ์ด๊ธฐํ๊ฐ ๋๊ณ b++์ด ๋๊ณ
// ๊ทธ ์์์ console.log(a, b) ๋ฅผ ํด์ 1,101์ด ์ฐํ๊ณ
// ๋ง์ง๋ง console.log(b)์์ hiํจ์๋ก b์ ๊ฐ์ด 101๋ก ํ ๋น๋์๊ธฐ ๋๋ฌธ์ 101์ด ์ฐํ๋ค.
'ํญํด99' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Javascript ๊ฐ๋ ์ ๋ฆฌ(2) - ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ (0) | 2022.07.16 |
---|---|
Javascript ๊ฐ๋ ์ ๋ฆฌ(1) ์๋ฃํ๊ณผ ๋์ ์ธ์ด (0) | 2022.07.16 |
[Chapter 1] e๋ฐ 10์กฐ S.A(Starting Assignment) (0) | 2022.07.11 |