Execution Context
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๊ฐ ์์ฑ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ทธ๋๋ก ์คํํ๋ ๊ฒ์ด์๋๋ผ, ์ฌ์ค์ ํจ์์ ์คํ ๋ฐฉ์๊ณผ ๋น์ทํ ์๋ฆฌ๋ก ์๋ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ตฌ๋ํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
- Creation (Pre-parsing) Phase: ์คํํ๊ธฐ ์ ์ ๋ณ์์ ํจ์๊ฐ ์ด๋ค ๊ฒ์ธ์ง ๋ถ์ํ๊ณ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์ฝํ๋ค.
- Execution Phase: ๋ณ์์ ๊ฐ์ ํ ๋นํ๊ณ ํจ์๊ฐ ์ค์ ๋ก ์คํ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๊ตฌ์ฑ: Stack + Heap
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ Stack + Heap ๋๊ฐ๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ๋์์๋ฆฌ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๊ฐ๋ง ๊ธฐ์ตํ์.
- Stack(์คํ): ํจ์ ํธ์ถ ์์๋๋ก ํจ์๊ฐ ์ ์ฅ๋๊ณ ์คํ๋๋ ๊ณต๊ฐ = ์คํ ์ปจํ ์คํธ
- Heap: ๋ ์์ปฌ ํ๊ฒฝ(Lexical Environment) = ๋ณ์/ํจ์ ์ ์ฅ์
https://1000sang-dev.tistory.com/12
ํด๋น ๊ธ์ ์ฐธ๊ณ ํ์
์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ด ํจ์ ๋์ ์๋ฆฌ: Stack(์คํ ์ปจํ ์คํธ) + Heap(๋ ์์ปฌ ํ๊ฒฝ)
ํจ์๊ฐ ์คํ๋ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋น ํจ์๋ฅผ ์คํํ๊ธฐ ์ํด ํน์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ์คํ ์ปจํ ์คํธ(Execution Context)๋ผ๊ณ ํ๋ค. ์คํ ์ปจํ ์คํธ๋ ํจ์ ์คํ์ ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
- Stack(์คํ ์ปจํ ์คํธ): ํจ์๊ฐ ์คํ๋๋ ๋์์ ํ๊ฒฝ์ ๊ด๋ฆฌํ๋ ์คํ
- Heap(๋ ์์ปฌ ํ๊ฒฝ): ํจ์ ๋ด์์ ์ ์๋ ๋ณ์์ ํจ์๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ
๋ ์์ปฌ ํ๊ฒฝ์๋ ํจ์์ ๋ณ์์ ์์, ์ค์ฒฉ ํจ์ ๋ฑ์ด ์ ์ฅ๋๋ค. `let`, `const`๋ ์ด ๋ ์์ปฌ ํ๊ฒฝ์์ ์ ์ฅ๋๋ฉฐ, `var`๋ ํจ์์ ๋ณ์ ํ๊ฒฝ์ ์ ์ฅ๋๋ค. `let`๊ณผ `const`๋ ๋ธ๋ก ๋ ๋ฒจ์์ ์๋ํ๋ฉฐ, `var`๋ ํจ์ ๋ ๋ฒจ์์ ์๋ํ๋ค.
์คํ ์ปจํ ์คํธ
์ด ์ฏค๋๋ฉด ์คํ ์ปจํ ์คํธ๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํด์ง ๊ฒ์ด๋ค.
์คํ ์ปจํ ์คํธ๋ ํจ์๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ฉฐ, ํจ์ ์คํ์ด ๋๋๋ฉด ์ฌ๋ผ์ง๊ฒ๋๋ค. ์คํ ์ปจํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๊ฐ ํฌํจ๋๋ค.
1. ๋ ์์ปฌ ํ๊ฒฝ: ํจ์ ๋ด์์ ์ฌ์ฉ๋๋ ๋ณ์์ ์์, ํจ์ ๋ฑ์ด ํฌํจ๋ ํ๊ฒฝ์ด๋ค.
2. ๋ณ์ ํ๊ฒฝ: `var`๋ก ์ ์ธ๋ ๋ณ์๊ฐ ํฌํจ๋ ์์ญ์ด๋ค.
3. ์ค์ฝํ ์ฒด์ธ: ์์ ์ค์ฝํ์ ์ ๊ทผํ๊ธฐ ์ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋๋ค.
- JS ์์ง ์ํ์ ์ํ ์ต์์ ํจ์: Global Function, ํ ํ๋ก๊ทธ๋จ์์ main() ํจ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- Global Function์ Global Object ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋๋ค.
- ์น ์๋ฒ(Node.js)๋ global
- ์น ๋ธ๋ผ์ฐ์ (ํฌ๋กฌ) ์์๋ window
- Global Function์ Global Object ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ๊ณผ์
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์คํ๋ ๋, ์์ง์ ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
- Creation(Pre-parsing) Phase: ํจ์(ํ์ผ) ๋ถ์ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ณ์์ ํจ์ ์ ์ฌ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ์ผ์ ์คํํ๊ธฐ ์ , ๋จผ์ ์ฝ๋์ ๋ฑ์ฅํ๋ ๋ชจ๋ ๋ณ์์ ํจ์ ์ ์ธ์ ๋ถ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ค.
์ด ๊ณผ์ ์ Creation Phase๋ผ๊ณ ํ๋ฉฐ, ์ด ๋จ๊ณ์์ ๋ณ์์ ํจ์๊ฐ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค. ์ด ๊ณผ์ ์์ ์ค์ํ ๊ฐ๋ ์ค ํ๋๊ฐ ๋ฐ๋ก Hoisting(ํธ์ด์คํ )์ด๋ค.
https://1000sang-dev.tistory.com/32
ํด๋น ๊ธ์ ํธ์ด์คํ ์ ๋ํ ์์ธํ ์ค๋ช ์ด ๋์์๋ค.
Lexical Scope(๋ ์์ปฌ ์ค์ฝํ)
ํจ์๊ฐ ์ ์ธ๋ ๋, ํจ์ ๋ด๋ถ์์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ์ด๋ค ๊ฐ์ธ์ง ๊ฒฐ์ ํ๋ ์์ ์ Lexical Scope๋ผ๊ณ ํ๋ค. ํจ์๊ฐ ํธ์ถ๋๋ ์์ ์ด ์๋๋ผ ์ ์ธ๋๋ ์์ ์์์ ์ธ๋ถ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค.
let x = 10;
function outer() {
console.log(x); // 10 (์ ์ธ ์์ ์ ๋ณ์ ๊ฐ)
}
x = 20;
outer(); // ์ฌ์ ํ 10์ด ์ถ๋ ฅ๋๋ค. ํธ์ถ ์์ ์ x ๊ฐ์ด์๋ ์ ์ธ ์์ ์ x๊ฐ์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ.
- Execution Phase: ํจ์ ์คํ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ ํ๋ณด ๋ฐ ์คํ
์ด์ ์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋๋ Execution Phase๋ก ๋์ด๊ฐ๋ค. ์ด ๋จ๊ณ์์๋ ํจ์๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํ๊ณ , ๋ณ์์ ๊ฐ์ด ํ ๋น๋๊ณ ํจ์๊ฐ ์คํ๋๋ค.
๋ณ์ ํ ๋น๊ณผ Scope Chain
- ๋ณ์ ํ ๋น: ์ด ๋จ๊ณ์์๋ ๋ณ์๊ฐ ์ค์ ๋ก ๊ฐ์ ํ ๋น๋ฐ๋๋ค. ํจ์ ๋ด๋ถ์์ ๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด, ํจ์๊ฐ ์ํ ์์ ์ค์ฝํ๋ ๊ธ๋ก๋ฒ ์ค์ฝํ์์ ๋ณ์๋ฅผ ์ฐพ๊ฒ๋๋ค. ์ด๋ฅผ Scope Chain์ด๋ผ๊ณ ํ๋ค.
let a = 10;
function scopeTest() {
let b = 20;
console.log(a) // a๋ ํจ์ ์ค์ฝํ์์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์, ์์ ์ค์ฝํ์์ ์ฐพ๋๋ค
scopeTest(); // 10 ์ถ๋ ฅ
ํจ์์คํ
- ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค Execution Context(์คํ ์ปจํ ์คํธ)๊ฐ ์์ฑ๋๋ค. ์ด ์คํ ์ปจํ ์คํธ๋ ํจ์๊ฐ ์คํ๋๋ฉด์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊ณผ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค. ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ๊ทธ์ ๊ด๋ จ๋ ์คํ ์ปจํ ์คํธ๋ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
TDZ (Temporal Dead Zone): let, const์ ReferenceError ์ดํด
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณ์ ํธ์ด์คํ ์ `var`, `let`, `const` ๋ชจ๋์๊ฒ ์ ์ฉ๋๋ค. ๊ทธ๋ฌ๋ `let`๊ณผ `const`๋ TDZ(Temporal Dead Zone, ์ผ์์ ์ธ ์ฌ๊ฐ์ง๋)์ ์ํด `var`์๋ ๋ค๋ฅธ ๋์์ ๋ณด์ธ๋ค. TDZ๋ ๋ณ์๊ฐ ์ด๊ธฐํ๋๊ธฐ ์ ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ก ์ธํด `let`๊ณผ `const`๋ ์ ์ธ ์ดํ์๋ ๊ฐ์ ํ ๋นํ๊ธฐ ์ ๊น์ง ReferenceError๊ฐ ๋ฐ์ํ๋ค.
`var`์ `let`์ ์ฐจ์ด
- `var`๋ ํธ์ด์คํ ์ด๋์ด ์ด๊ธฐํ๊น์ง ํจ๊ป ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ์ ์ธ์ ์ ์ ๊ทผํด๋ undefined๋ฅผ ๋ฐํํ๋ค. (์ ์ธ + ์ด๊ธฐํ)
- `let`๊ณผ `const`๋ ํธ์ด์คํ ๋์ง๋ง, ์ด๊ธฐํ๊ฐ ์คํ ๋จ๊ณ์์ ์ด๋ฃจ์ด์ง๋ฏ๋ก ๊ทธ ์ ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ReferenceError๊ฐ ๋ฐ์ํ๋ค.(์ ์ธO / ์ด๊ธฐํ X)
console.log(a); // undefined(var๋ก ์ ์ธ๋ a๋ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ)
var a = 5;
console.log(b); // ReferenceError(์ด๊ธฐํ X)
let b = 10;
console.log(c); // ReferenceError(์ด๊ธฐํ X)
const c = 15;
Lexical Scope + ScopeChain + Hoisting
โถ name = 'nero'
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
name = 'nero'
log();
}
wrapper();
Creation Phase(์์ฑ ๋จ๊ณ)
1. ์ ์ญ ์คํ ์ปจํ ์คํธ ์์ฑ
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ ์ญ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ค.
- ์ด ์ปจํ ์ฝ์ผ ์์ ์ ์ญ ๋ณ์์ ํจ์๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋ก๋๋ค.
2. ๋ณ์์ ํจ์์ ์ ์ธ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ(ํธ์ด์คํ )
- `var name`์ undefined๋ก ์ด๊ธฐํ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค.
- `log` ํจ์ ์ ์ธ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค.
- `wrapper` ํจ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค.
- ํจ์ ๋ด๋ถ์ ์ฝ๋๋ ์์ง ์คํ๋์ง ์์๊ธฐ ๋๋ฌธ์ `name='nero'๋ ์ฒ๋ฆฌ๋์ง ์๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, Creation Phase์์์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋
- `name`: undefined(ํธ์ด์คํ ๋ ์ํ)
- `log`: ํจ์ log() ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- `wrapper`: ํจ์ wrapper() ๋ฉ๋ชจ๋ฆฌ ํ ๋น
Execution Phase(์คํ ๋จ๊ณ)
์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋๋ฉฐ, ๋ณ์์ ๊ฐ์ด ํ ๋น๋๊ณ ํจ์๊ฐ ํธ์ถ๋๋ค.
1. ์ ์ญ ์ฝ๋ ์คํ
- `var name = 'zero';` ์ ์ญ๋ณ์ `name`์ `'zero'`๊ฐ ํ ๋น๋๋ค.
- name: `'zero'`
- `function log() {...}`์ `function wrapper() {...}`๋ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฏ๋ก ํจ์ ์ ์ธ์ ์คํ๋์ง ์๊ณ ๋์ด๊ฐ๋ค.
2. `wrapper()` ํจ์ ํธ์ถ
- `wrapper()`๋ฅผ ํธ์ถํ๋ฉด์ wrapper ํจ์ ๋ด๋ถ ์ฝ๋๊ฐ ์คํ๋๋ค.
- wrapper ์คํ ์ ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค. ์ด๋๋ ์ ์ญ ๋ณ์ `name`์ ์ ๊ทผํ ์ ์๋ค.
- `name='nero'`๊ฐ ์คํ๋์ด, ์ ์ญ ๋ณ์ `name`์ด `'nero'`๋ก ๋ฎ์ด์์์ง๋ค.
3. `log()` ํจ์ ํธ์ถ
- `log()` ํจ์๋ wrapper ์์์ ํธ์ถ๋๋ค.
- `log()`๊ฐ ์คํ๋ ๋, ์ ์ญ ๋ณ์ `name`์ ์ฝ์ด์ ์ฝ์์ `'nero'`๋ฅผ ์ถ๋ ฅํ๋ค.
- `wrapper`ํจ์์์ ์ด๋ฏธ ์ ์ญ ๋ณ์ `name`์ด `'nero'`๋ก ๋ฎ์ด์์์ก๋ค.
์ต์ข ์ ์ผ๋ก 'nero'๊ฐ ์ถ๋ ฅ๋๋ค.
โถ var name='nero'
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
var name = 'nero'
log();
}
wrapper();
Creation Phase(์์ฑ ๋จ๊ณ)
1. ์ ์ญ ์คํ ์ปจํ ์คํธ ์์ฑ
- ์ ์ญ ์คํ ์ปจํ ์คํธ ์์ฑ.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ์ญ์์ ์ ์ธ๋ ๋ณ์์ ํจ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ
2. ๋ณ์์ ํจ์์ ์ ์ธ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ (ํธ์ด์คํ )
- `var name`์ undefined๋ก ์ด๊ธฐํ๋์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ.
- `log`ํจ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ
- `wrapper`ํจ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ
Execution Phase(์คํ ๋จ๊ณ)
1. ์ ์ญ ์ฝ๋ ์คํ
- `var name = 'zero';` ์คํ์ผ๋ก ์ ์ญ ๋ณ์ `name`์ `'zero'`๊ฐ ํ ๋น๋๋ค.
- name:`'zero'`
2. wrapper() ํจ์ ํธ์ถ
- ์ ์ญ ์ฝ๋์์ `wrapper()`๊ฐ ํธ์ถ๋๋ฉด ํจ์ ๋ด๋ถ์ ์ฝ๋๊ฐ ์คํ๋๋ค.
- wrapper ํจ์๊ฐ ์คํ๋๋ฉด์ wrapper ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ค.
- wrapper ๋ด๋ถ์์ `var name = 'nero';`๊ฐ ์คํ๋๋ฉฐ, wrapper ํจ์ ์ค์ฝํ์ ์๋ก์ด `name`๋ณ์๊ฐ ์์ฑ๋๋ค. ์ด ๋ณ์๋ wrapper ํจ์ ์ค์ฝํ์๋ง ์ ์ฉ๋๋ฏ๋ก, ์ ์ญ ๋ณ์ `name`๊ณผ๋ ๋ณ๊ฐ์ ๋ณ์์ด๋ค. → ์ ํ ๋ค๋ฅธ ๊ฐ์ฒด. ํท๊ฐ๋ฆฌ์ง ๋ง ๊ฒ !
- wrapper ์ค์ฝํ์์ `name`์ nero๊ฐ ๋๋ค.
- ๊ทธ๋ฌ๋ log() ํจ์๋ ์ ์ญ ์ค์ฝํ์ ์ ์ธ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, log ํจ์๋ ์ ์ญ ์ค์ฝํ์ ๋ณ์์ ์ ๊ทผํ๋ค.
3. log() ํจ์ ํธ์ถ
- log() ํจ์๋ ์ ์ญ ์ค์ฝํ์ ์ ์ธ๋ ํจ์์ด๋ฏ๋ก, ์ ์ญ ๋ณ์ `name`์ ์ฐธ์กฐํ๋ค.
- ์ ์ญ ๋ณ์ `name`์ ๊ฐ์ `'zero'`๋ก ๋จ์์๋ค.
- ๋ฐ๋ผ์ log() ํจ์๊ฐ ํธ์ถ๋๋ฉด ์ ์ญ ๋ณ์ `name`์ ๊ฐ์ธ 'zero'๊ฐ ์ถ๋ ฅ๋๋ค
์ต์ข ์ ์ผ๋ก 'zero'๊ฐ ์ถ๋ ฅ๋๋ค.
๐คฏํ์๋ ์ด ํ๋ฆ์ ์ดํดํ๋๋ฐ ๋ช ์๊ฐ์ด๋ ๊ฑธ๋ ธ๋ค.. ํท๊ฐ๋ ธ๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ ๋นจ๊ฐ๊ธ์จ์ด๋ค.
ํ์ ์๊ฐ์๋ `nero`๊ฐ ์ถ๋ ฅ์ด ๋์ด์ผํ๋๋ฐ ์ ์๊พธ `zero`๊ฐ ์ถ๋ ฅ์ด ๋๋ ๊ฒ์ผ๊น?
์ด ๊ณ ๋ฏผ ๋์ ๋์ถํ ๊ฒฐ๋ก ์ wrapper ํจ์ ์ค์ฝํ์ ์๋ `name`๊ณผ ์ ์ญ๋ณ์ `name`์ ์๋ก ๋ค๋ฅธ ๋ณ์๋ผ๋ ๊ฒ์ด๋ค. ์ ์ญ ์ค์ฝํ์ ๋ณ์๋ logํจ์์์ ์ฐธ์กฐ๋๊ณ ์๊ธฐ๋๋ฌธ์, `zero`๊ฐ ์ถ๋ ฅ๋๋ค๋ ์ ์ ์๊ฒ๋์๋ค.
๋ง์ฝ `wrapper`ํจ์ ์ค์ฝํ์ ์๋ `name`์ด๋ผ๋ ๋ณ์ ์ด๋ฆ์ด ๋ค๋ฅด๋ค๋ฉด ๋ ํท๊ฐ๋ ธ์ ๊ฒ ๊ฐ๋ค.
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
var sibar = 'nero'
log();
}
wrapper();
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋๊ฐ์ด `'zero'`๊ฐ ์ถ๋ ฅ๋๋ค.
์ด ๊ธ์ ๋ณด๋ ์ฌ๋์ด ๋ง์ฝ ์๋ค๋ฉด ํ์์ฒ๋ผ ์ธ๋ฐ์๋ ๊ณ ๋ฏผ์ ์๊ฐ์ ์๋ผ๋๋ก ํ์
์ ์ญ๋ณ์์ ํจ์ ์ค์ฝํ ๋ด์ ๋ณ์๊ฐ ๋ค๋ฅด๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ logํจ์๋ ์ ์ญ ์ค์ฝํ์ ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค๋ ์ฌ์ค์ ์ดํดํ๋ฉด ํท๊ฐ๋ฆฌ์ง ์์ ๊ฒ์ด๋ค.
+) Scope Chain์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ณ์๋ฅผ ์ฐพ์ ๋ ํ์ฌ ์ค์ฝํ์์ ๋จผ์ ๊ฒ์ํ๊ณ , ํด๋น ๋ณ์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์์ ์ค์ฝํ๋ก ๊ณ์ํด์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๋ณ์๋ฅผ ์ฐพ๋ ๋ฐฉ์์ด๋ค. (๊ฐ์ฐ์๋ฅผ ๋ ์ฌ๋ฆฌ๋๋ก ํ์) ๊ฒฐ๊ตญ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ณ์๊ฐ ์ ์ธ๋ ์ ์ธ๋ถ๋ฅผ ์ฐพ์๊ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ง์ฝ, ํ์ฌ ์ค์ฝํ์ ์์ ์ค์ฝํ ์ด๋์์๋ ํด๋น ๋ณ์๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด, ์ต์ข ์ ์ผ๋ก ์ ์ญ ์ค์ฝํ๋ฅผ ํ์ธํ๊ณ , ๊ทธ๋๋ ๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ReferenceError๋ฅผ ๋ฐ์์ํจ๋ค.
๐ ์ฝ๋์์ ํจ์์ ๋ณ์๊ฐ ์ด๋ค ์ค์ฝํ์ ์๋์ง ์ ๊ฒฝ ์จ์ผํ๋ค๋ ์ ! ๊ผญ ๊ธฐ์ตํ๋๋ก ํ์.
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JavaScript ํจ์ ๋ด this์ ๋ฉ์๋ ๋ด this ์ฐจ์ด (1) | 2024.09.09 |
---|---|
JavaScript ํจ์ ์์ฑ ๋ฐฉ๋ฒ (1) | 2024.09.08 |
JavaScript ๋ณ์, ํจ์ ์ ์ ๋ฐ ์ฌ์ฉ (0) | 2024.09.05 |
JavaScript ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ (4) | 2024.09.04 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋์ ์๋ฆฌ (0) | 2024.08.19 |