2025. 8. 23. 12:28ใFront-end/JavaScript

๋ชฉ์ฐจ
1. ์ค์ฝํ (Scope)
1-1. ์ค์ฝํ๋
1-2. ๋ ์์ปฌ ์ค์ฝํ
1-3. ์ค์ฝํ ์ฒด์ธ
2. ํธ์ด์คํ (Hoisting)
3. JS์์ง์ด ์ค์ฝํ์ ํธ์ด์คํ ์ ๊ตฌํํ๋ ๋ฐฉ์
3-1. ์คํ ์ปจํ ์คํธ ๊ตฌ์กฐ ๊ฐ๋จํ๊ฒ ๋ณด๊ธฐ
3-2. ์คํ ์ปจํ ์คํธ์์
3-3. ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์
3-4. ์คํ ์ปจํ ์คํธ + ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ํจ๊ป ๋ณด๊ธฐ
1. ์คํ ์ปจํ ์คํธ ๊ตฌ์กฐ ๊ฐ๋จํ๊ฒ
2. ์คํ ์ปจํ ์คํธ์์
3. ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์
4. ์คํ ์ปจํ ์คํธ + ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ํจ๊ป ๋ณด๊ธฐ
1. ์ค์ฝํ (Scope)
1. ์ค์ฝํ๋
์ค์ฝํ๋ ๋ณ์๋ ๋งค๊ฐ๋ณ์์ ์ ๊ทผํ ์ ์๋ ๋ฒ์์ด๋ค.
์ค์ฝํ ์ข ๋ฅ
- ์ ์ญ ์ค์ฝํ (global scope)
ํจ์ ๋ฐ๊นฅ/ ์ต์์์์ ์ ์ธ๋ ๋ณ์๋ก, ์ด๋์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
์ ์ญ ์ค์ผ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅํ๋ค. - ํจ์ ์ค์ฝํ (function scope)
function ๋ธ๋ก ๋ด๋ถ์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ๋ด์์๋ง ์ ํจํ๋ค. - ๋ธ๋ก ์ค์ฝํ (block scope)
{ }์ค๊ดํธ ๋ธ๋ก ๋จ์๋ก ์ ํจ ๋ฒ์๋ฅผ ์ ํํ๋ค.
2. ๋ ์์ปฌ ์ค์ฝํ
JS์์ ์ค์ฝํ๋ ๋ณ์/ํจ์๋ฅผ ์ด๋์ ์์ฑํ์๋๊ฐ์ ๊ธฐ์ดํ์ฌ ๊ฒฐ์ ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ ๋ ์์ปฌ ์ค์ฝํ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
function foo() {
var a = 1;
function bar(b) {
console.log(a, b);
}
bar(2);
}
foo(); // ์ ์ญ ์ค์ฝํ๋ ํ์ ์ค์ฝํ์ธ foo() ๋ฒ์ ๋ด์ ๋ณ์ a์ ์ ๊ทผ ๋ถ๊ฐ
์ ์์ ์ฝ๋์์ ์ด ์ธ ๊ฐ์ ์ค์ฝํ๊ฐ ์ค์ฒฉ๋์ด ์๋ค.
- ์ ์ญ ์ค์ฝํ : foo()
- foo() ํจ์ ์ค์ฝํ : var a, function bar(b), bar(2)
- bar() ํจ์ ์ค์ฝํ : console.log(a, b)
์ค์ฝํ๋ ์ด๋ ๊ฒ ํจ์๋ฅผ ์ด๋์์ ์์ฑํ๋๋์ ๋ฐ๋ผ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ง๋ค.
3. ์ค์ฝํ ์ฒด์ธ
- ๋ณ์๋ฅผ ์ฐพ์ ๋ ํ์ฌ ์ค์ฝํ → ์์ ์ค์ฝํ → ์ ์ญ ์ค์ฝํ ์์ผ๋ก ํ์
- JS๋ ๋ ์์ปฌ ์ค์ฝํ(Lexical Scope) → ํจ์ ์ ์๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋จ
2. ํธ์ด์คํ (Hoisting)
JS ์์ง์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ , ๋ณ์/ํจ์์ ์ ์ธ์ ์ค์ฝํ ๋ด์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ๋์์ ๊ฐ๋ ์ด๋ค.
console.log(a); // undefined
var a = 1;
์์ ์ฝ๋์์ a๊ฐ ์ ์ธ๋๊ธฐ ์ ์ a๋ฅผ ์ฐธ์กฐํ์ผ๋, ์๋ฌ๊ฐ ์๋ undefined๋ก ์ ์ ์คํ๋๋ค.
์ ์ธ๋ฌธ var a = 1;์ด ์ ์ญ ์ค์ฝํ ๋ด์์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ก๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
ํธ์ด์คํ ์ ์ธ๋จ๊ณ๋ก ๋๋์ด์ง๋ค.
- ์ ์ธ : JS์์ง์ด ์ค์ฝํ์ ๋ณ์๋ฅผ ์ ์ธ
- ์ด๊ธฐํ : ๋ณ์์ ๊ฐ์ undefined๋ก ์ด๊ธฐํ
- ํ ๋น : ํ ๋น๋ฌธ์ ๋ง๋๋ฉด ๋ณ์์ ์ค์ ๊ฐ์ ํ ๋น
์ด ๋ var ๋ณ์๋ 1, 2๋จ๊ณ๋ฅผ ํ ๋ฒ์ ์คํํ๊ธฐ ๋๋ฌธ์ ์ ์ธ ์ ์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง let, const ๋ณ์๋ 1,2๋จ๊ณ๊ฐ ๋ถ๋ฆฌ๋์ด ์์ด, ์ด๊ธฐํ ๋จ๊ณ ์ ์ ์ ๊ทผํ ์ ์๋ค.
console.log(a); // Uncaught ReferenceError: a is not defined
let a = 1;
| ๋ณ์ ํธ์ด์คํ |
var | ๋ณ์ ์ ์ธ ํธ์ด์คํ
๊ณผ ๋์์ undefined๋ก ์ด๊ธฐํ |
console.log(a); // undefined var a = 1; |
| let | ์ ์ธ๋ง ํธ์ด์คํ
๋๊ณ TDZ์ ๋ค์ด๊ฐ ์ ์ธ ์ ์ ๊ทผ์ด ๋ถ๊ฐ |
console.log(a); // a is not defined let a = 1; |
|
| const | console.log(a); // a is not defined const a = 1; |
||
| ํจ์ ํธ์ด์คํ |
ํจ์ ์ ์ธ๋ฌธ function foo() {...} |
์ ์ธ๋ฌธ ์ ์ฒด๊ฐ ํธ์ด์คํ
๋์ด ์ ์ธ ์ ์๋ ํธ์ถ์ด ๊ฐ๋ฅ |
foo(); // ํจ์๊ฐ ์ ๋์ํจ function foo() { console.log('hello'); }; |
| ํจ์ ํํ์ const foo = function() {...} |
๋ณ์ ํธ์ด์คํ ๊ท์น์ ๋ฐ๋ฆ | foo(); // Uncaught TypeError: foo is not a function var foo = function() {...}; foo(); // Cannot access 'foo' before initialization let foo = function() {...}; |
** TDZ : Temporal Dead Zone์ ์ฝ์๋ก, ๋ณ์๊ฐ ์ ์ธ๋๊ธฐ ์ ๊น์ง ์ ๊ทผํ ์ ์๋ ๊ฐ๋ ์ ๊ตฌ๊ฐ
2. JS์์ง์ด ์ค์ฝํ์ ํธ์ด์คํ ์ ๊ตฌํํ๋ ๋ฐฉ์
JS์์ง์ด ์ค์ฝํ์ ํธ์ด์คํ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๊ฐ๋ ๋ณ๋ก ๋๋์ด์ ์์๋ณด์.
1. ์คํ ์ปจํ ์คํธ ๊ตฌ์กฐ ๊ฐ๋จํ๊ฒ ๋ณด๊ธฐ
ECMAScript์์ ์คํ ์ปจํ ์คํธ๋ ์ด๋ฐ์์ผ๋ก ๋๋๋ค.
Execution Context
โโ Lexical Environment
โ โโ Environment Record (๋ณ์/ํจ์ ์ค์ ๊ธฐ๋ก)
โ โโ Outer Reference (์์ ์ค์ฝํ ์ฐ๊ฒฐ)
โโ Variable Environment (var ์ ์ฉ, ํธ์ด์คํ
๊ด๋ฆฌ)
์คํ ์ปจํ ์คํธ(EC)๋ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์๋ฏธํ๋ฉฐ, ํฌ๊ฒ ์ธ ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ด๋๋ค.
- Variable Environbment (๋ณ์ ํ๊ฒฝ)
- Lexical Environment (๋ ์์ปฌ ํ๊ฒฝ)
- This ๋ฐ์ธ๋ฉ
๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํํ๋ฉด JS์์ง์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋๋ฐ,
์ด ๋ ๋ณ์๋ฅผ ์ค์ ๋ก ๋ด๊ณ ์๋ ๊ฐ์ฒด์ธ ํ๊ฒฝ ๋ ์ฝ๋๊ฐ ์คํ ์ปจํ ์คํธ์ ์๋ง์ ๋ฒ์์ ํฌํจ๋๋ค.
ํ๊ฒฝ ๋ ์ฝ๋๋ ์๋ณ์(indentifier) - ๊ฐ(value) ๋งคํ์ ์ ์ฅํ๋ ๋ด๋ถ ๊ตฌ์กฐ์ฒด๋ก,
์ ์ธํ๋ ๋ณ์์ ํจ์, ๋งค๊ฐ๋ณ์ ๋ฑ์ ์ด๋ฆ๊ณผ ๊ฐ์ ๊ธฐ์ตํ๋ค.
let a = 1;
1. ์ฝ๋ (let a = 1;) ๋ฅผ ์์ฑํ๊ณ ์คํ
2. ์คํ ์ปจํ ์คํธ ์์ฑ
2-1. ํ๊ฒฝ ๋ ์ฝ๋์ let a์ ์๋ณ์์ ๊ฐ(1)์ด ๋งคํ๋จ
2-2. let a์ ๊ฐ 1์ Lexcial Environment์ Environment Record ์์ญ์ ๊ธฐ๋ก๋จ
3. ์คํ ์ปจํ ์คํธ ์คํ
4. ์ฝ๋๋ฅผ ํ์ค์ฉ ์ฝ์ผ๋ฉฐ ์์ ์ ์งํ
2. ์คํ ์ปจํ ์คํธ์์
JS ์์ง์ ์ฝ๋๋ฅผ ์คํํ ๋ ์คํ ์ปจํ ์คํธ๋ผ๋ ํ๊ฒฝ์ ์์ฑํ๋๋ฐ, ์คํ ์ปจํ ์คํธ์ ์ฒ๋ฆฌ๋ ํฌ๊ฒ 2๋จ๊ณ๋ก ๋๋๋ค.
- ์์ฑ ๋จ๊ณ (Creation Phase)
- ์ค์ฝํ(ํ๊ฒฝ ๋ ์ฝ๋)์ ๋ณ์๋ค์ด ๋จผ์ ์ค์ ๋จ (ํธ์ด์คํ ๋ฐ์ ๊ตฌ๊ฐ)
- var ๋ณ์๋ undefined๋ก ์ด๊ธฐํ
- let, const๋ ์์ง ์ด๊ธฐํ๋์ง ์์ ์ํ(์ ์ธ๋ง ๋ ์ํ)๋ก, TDZ์ ๋ค์ด๊ฐ
- ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ๊ฐ์ฒด ์ ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋จ
- ์คํ ๋จ๊ณ (Execution Phase)
- ์ฝ๋๊ฐ ํ ์ค์ฉ ์คํ๋๋ฉฐ ๋ณ์์ ์ค์ ๊ฐ์ด ํ ๋น๋จ
- ํจ์๊ฐ ํธ์ถ๋๋ฉด ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ๋ง๋ค์ด์ ธ ์ฝ ์คํ์ ๋ค์ด๊ฐ(push)
3. ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ํ๊ฒ ํ ๋นํ๋ฉฐ ์คํ ์ปจํ ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋ธ๋ผ์ฐ์ ์ JS์์ง์ ์ฑ๊ธ ์ค๋ ๋๊ฐ ์ฝ ์คํ์ ์ฌ์ฉํ์ฌ ์คํ ์์๋ฅผ ๊ด๋ฆฌํ๋ ์์ด๋ค.
- ์คํ ๋ฉ๋ชจ๋ฆฌ
- ์คํ ์ปจํ ์คํธ(= ์ค์ฝํ ํ๊ฒฝ)๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ด ๋๋ค.
- ํจ์ ํธ์ถ ์ ์คํ ์ปจํ ์คํธ๊ฐ ์คํ์ push๋๊ณ , ์ข ๋ฃ ์ popํ๋ค.
- ํ ๋ฉ๋ชจ๋ฆฌ
- ์ฐธ์กฐ ํ์ (Object, Array, Function ๋ฑ)์ ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ค.
- ์ค์ ๊ฐ๋ค์ ์ ์ฅํ์ฌ, [์คํ์ ์ ์ฅ๋ - ์คํ ์ปจํ ์คํธ ์์ - ๋ณ์]๋ค์ ํ์ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
- ์ฝ ์คํ
- ์คํ ์ปจํ ์คํธ๋ค์ ๊ด๋ฆฌํ๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ์ฝ๋ ์คํ ์์(ํธ์ถ๊ณผ ์ข ๋ฃ)๋ฅผ ๋ด๋นํ๋ค.
4. ์คํ ์ปจํ ์คํธ + ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ํจ๊ป ๋ณด๊ธฐ
์ค์ ๋ก ๋ณ์(var, let, const)์ ํจ์๋ฅผ ์ ์ธํ์ ๋ ์ค์ฝํ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๊ณ ํธ์ด์คํ ์ด ์ด๋ป๊ฒ ์ผ์ด๋๋์ง ๊ณผ์ ์ ์ดํด๋ณด์.
console.log(x); // undefined (ํธ์ด์คํ
์ผ๋ก var ์ ์ธ๋ง ์๋ก)
console.log(y); // ReferenceError (TDZ ๋๋ฌธ์)
console.log(z); // ReferenceError (TDZ ๋๋ฌธ์)
foo();
bar();
var x = 1;
let y = 2;
const z = 3;
function foo() {
console.log(“foo ์คํ");
}
const bar = function() {
console.log(“var ์คํ");
}
console.log๋ก ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ ๋ถ๋ถ + ํจ์ ํธ์ถ ๋ถ๋ถ์ ๋บ ์๋ ๋ถ๋ถ๋ง ์ ๋ฆฌํ๋ค.
์คํ์ ์์ด๋ ๊ณผ์ ์ ๊ทธ๋ฆฌ๋ ค๋ฉด ์ฝ๋ ์ ์ฒด์ ๋ํด ๊ทธ๋ ค์ผํ๊ธฐ ๋๋ฌธ์ ์คํ ์ญ์ ์ ์ธํ๋ค.

๐ฅ JS ์์ง์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ์ฌ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
๐ฅ ์ค์ฝํ๋ ์คํ ์ปจํ ์คํธ์ ํ๊ฒฝ ๋ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ค.
์ฐธ๊ณ
'Front-end > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| B25 : ์ํฌ๋งต๊ณผ ์ํฌ์ (weak) ๊ฐ์ฒด (0) | 2025.08.26 |
|---|---|
| B24: ๋งต๊ณผ ์ (map & set) ๊ฐ์ฒด (0) | 2025.08.26 |
| B22 : ๋ฌธ์์ด ์ฌํ (4) | 2025.08.21 |
| B21 : ์ซ์ํ ์ฌํ (0) | 2025.08.21 |
| B20 : ๋ฐฐ์ด (2) | 2025.08.21 |
GitHub