[JavaScript] ์คํ ์ปจํ ์คํธ(Execution Context)๊ฐ ๋ฌด์์ผ๊น์?

๋ค์ด๊ฐ๋ฉฐ ๐
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ดํดํ๋ ๋ฐ ์์ด์ ์คํ ์ปจํ ์คํธ(Execution Context)์ ๊ฐ๋ ์ ๋ํด์ ์์งํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ๋ ์ค ํ๋๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฝ๋์ ์คํ ์์์ ๋ฐฉ์์ ๊ฒฐ์ ํ๊ฒ ๋์ฃ .
์คํ ์ปจํ ์คํธ(Excution Context)๋โ
์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์ธ์ด๋ก์์ ์ฑ๊ฒฉ์ ๊ฐ์ฅ ์ ํ์ ํ ์ ์๋ ๊ฐ๋ ์ ๋๋ค.
๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์คํ ์ปจํ ์คํธ๊ฐ ํ์ฑํ๋๋ ์์ ์ ์๋์ ๊ฐ์ ๋์์ ์ํํฉ๋๋ค.
- ํธ์ด์คํ (hoisting)
- ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด ๊ตฌ์ฑ
- this ๊ฐ ์ค์
๋ฑ๋ฑ ์ด๋ก ์ธํด ๋ค๋ฅธ ์ธ์ด์์๋ ๋ฐ๊ฒฌํ ์ ์๋ ํน์ดํ ํ์๋ค์ด ๋ฐ์ํฉ๋๋ค.
๋์ ๊ณผ์
๋์ผํ ํ๊ฒฝ์ ์๋ ์ฝ๋๋ค์ ์คํํ ๋ ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ด๋ฅผ ์ฝ ์คํ(Call Stack)์ ์์ ์ฌ๋ฆฝ๋๋ค.
๊ฐ์ฅ ์์ ์์ฌ์๋ ์ปจํ ์คํธ์ ๊ด๋ จ ์๋ ์ฝ๋๋ค์ ์คํํ๋ ์์ผ๋ก ์ ์ฒด ์ฝ๋์ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅํฉ๋๋ค.
์คํ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก๋
- ์ ์ญ ๊ณต๊ฐ
- eval() ํจ์
- ํจ์
๋ฑ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํํ ์คํ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ํจ์๋ฅผ ์คํํ๋ ๊ฒ์ ๋๋ค.
var a = 1;
function outer() {
function inner() {
console.log(a); // undefined
var a = 3;
}
inner();
console.log(a); // 1
}
outer();
console.log(a); // 1
์ ์ฝ๋์ ์์๋ฅผ ์คํ ์ปจํ ์คํธ ๊ด์ ์์ ๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.

- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ
- ์ ์ญ ์ปจํ ์คํธ๋ฅผ ์ฝ ์คํ์ ์ถ๊ฐ
- ์ ์ญ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์์ฐจ๋ก ์งํ
- outer์ ๋ํ ํ๊ฒฝ ์ ๋ณด ์์ง
- outer ์คํ ์ปจํ ์คํธ ์์ฑ ํ ์ฝ ์คํ์ ์ถ๊ฐ
- ์ ์ญ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ ์ผ์์ค๋จ (์ฝ ์คํ ๋งจ ์์ outer ์คํ ์ปจํ ์คํธ๊ฐ ๋์ธ ์ํ)
- outer ํจ์ ๋ด๋ถ์ ์ฝ๋ ์์ฐจ๋ก ์คํ
- inner ์คํ ์ปจํ ์คํธ ์์ฑ ํ ์ฝ ์คํ์ ์ถ๊ฐ
- outer์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ ์ผ์์ค๋จ (์ฝ ์คํ ๋งจ ์์ inner ์คํ ์ปจํ ์คํธ๊ฐ ๋์ธ ์ํ)
- inner ํจ์ ๋ด๋ถ์ ์ฝ๋ ์์ฐจ๋ก ์คํ
- ์ดํ์ ํจ์ ์คํ์ด ์ข ๋ฃ๋๋ฉด ์ฝ ์คํ์์ ์ ๊ฑฐ ๋๊ณ ์๋์ ์๋ ์คํ ์ปจํ ์คํธ ์ด์ด์ ์คํ
๊ตฌ์ฑ
์คํ ์ปจํ ์คํธ์ ๋ด๊ธฐ๋ ์ ๋ณด๋ค์ ์๋์ ๊ฐ์ต๋๋ค.
VariableEnvironment
- ํ์ฌ ์ปจํ ์คํธ ๋ด์ ์๋ณ์๋ค์ ๋ํ ์ ๋ณด
- ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด
- ์ ์ธ ์์ ์ LexicalEnvironment์ ์ค๋ ์ท โก๏ธ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์๋์ง ์์
VariableEnvironment์ ๋ด๊ธฐ๋ ๋ด์ฉ์ LexicalEnvironment์ ๊ฐ์ต๋๋ค.
ํ์ง๋ง, ์ต์ด ์คํ ์์ ์ค๋ ์ท์ ์ ์งํ๋ค๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ฆ, ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ๋ VariableEnvironment์ ์ ๋ณด๋ฅผ ๋จผ์ ๋ด์ต๋๋ค.
๋ค์์ผ๋ก ์ด๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํด์ LexicalEnvironment๋ฅผ ๋ง๋ญ๋๋ค.
์ดํ์๋ LexicalEnvironment๋ฅผ ์ฃผ๋ก ํ์ฉํฉ๋๋ค.
LexicalEnvironment
- ์ด๊ธฐ์๋ VaribaleEnvironment์ ๊ฐ์
- ์ดํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋จ
environmentRecord์ ํธ์ด์คํ
environmentRecord์๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ, ํจ์ ์ ์ธ, ๋ณ์๋ช ๋ฑ์ด ๋ด๊น๋๋ค.
ํ์ฌ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์๋ณ์ ์ ๋ณด๋ค์ด ์ ์ฅ๋ฉ๋๋ค.
์๋ณ์ ์ ๋ณด๋?
ํจ์์ ์ง์ ๋ ๋งค๊ฐ๋ณ์ ์๋ณ์, ํจ์ ์์ฒด, var๋ก ์ ์ธ๋ ๋ณ์์ ์๋ณ์ ๋ฑ๋ฑ ์๋ฏธํฉ๋๋ค.
์ฆ, ์ปจํ ์คํธ ๋ด๋ถ ์ ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์์๋๋ก ์์งํฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ผ๋ก ๋ณ์ ์ ๋ณด๋ฅผ ์์งํ์ฌ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์์๋ ๋ถ๊ตฌํ๊ณ ,
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฏธ ํด๋น ํ๊ฒฝ์ ์ํ ์ฝ๋์ ๋ณ์๋ช ๋ค์ ๋ชจ๋ ์๊ฒ ๋ ์ํฉ์ ๋๋ค.
๋๋ฌธ์ ์ฌ๊ธฐ์ ํธ์ด์คํ (hoisting)์ด๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํฉ๋๋ค.
ํธ์ด์คํ ์ ๊ด๋ จํด์๋ ํด๋น ๊ธ์์ ์์ธํ ๋ค๋ฃน๋๋ค.
์ค์ฝํ(Scope)์ outerEnvironmentReference
- ์ค์ฝํ(Scope)๋ ์๋ณ์์ ๋ํ ์ ํจ ๋ฒ์์ ๋๋ค.
- ์ด๋ค ๊ฒฝ๊ณ A์ ์ธ๋ถ์์ ์ ์ธํ ๋ณ์๋ A์ ์ธ๋ถ๋ฟ ์๋๋ผ A์ ๋ด๋ถ์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํ์ง๋ง, A์ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์๋ ์ค์ง A์ ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
ES5๊น์ง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ์ญ๊ณต๊ฐ์ ์ ์ธํ๋ฉด ์ค์ง ํจ์์ ์ํด์๋ง ์ค์ฝํ๊ฐ ์์ฑ๋ฉ๋๋ค.
ES6์์๋ ๋ธ๋ก์ ์ํด์๋ ์ค์ฝํ ๊ฒฝ๊ณ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ธ๋ก์ ES6์ ๋ฑ์ฅํ let, const, class, strict mode์์์ ํจ์ ์ ์ธ ๋ฑ์ ๋ํด์๋ง ๋ฒ์๋ก์ ์ญํ ์ ์ํํฉ๋๋ค.
๊ทธ๋์ ๋์ ๊ตฌ๋ถํ๊ธฐ ์ํด ํจ์ ์ค์ฝํ, ๋ธ๋ก ์ค์ฝํ๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ค์ฝํ ์ฒด์ธ(Scope Chain)
์๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ์์์๋ถํฐ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก ๊ฒ์ํด ๋๊ฐ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด LexicalEnvironment์ ๋ ๋ฒ์งธ ์์ง ์๋ฃ์ธ outerEnvironmentReference์ ๋๋ค.
outerEnvironmentReference๋ ํ์ฌ ํธ์ถ๋ ํจ์๊ฐ ์ ์ธ๋ ๋น์์ LexicalEnvironment๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
'์ ์ธํ๋ค'๋ผ๋ ํ์๊ฐ ์ค์ ๋ก ์ผ์ด๋ ์ ์๋ ์์ ์ด๋?
์ฝ ์คํ ์์์ ์ด๋ค ์คํ ์ปจํ ์คํธ๊ฐ ํ์ฑํ๋ ์ํ์ผ ๋๋ฟ์ ๋๋ค.
์ฆ, ๋ชจ๋ ์ฝ๋๋ ์คํ ์ปจํ ์คํธ๊ฐ ํ์ฑํ ์ํ์ผ ๋ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฅผ ๋ค์ด A ํจ์ ๋ด๋ถ์ B ํจ์๋ฅผ ์ ์ธํ๊ณ ๋ค์ B ํจ์ ๋ด๋ถ์ C ํจ์๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ
- ํจ์ C์ outerEnvironmentReference โก๏ธ ํจ์ B์ LexicalEnvironment
- ํจ์ B์ outerEnvironmentReference โก๏ธ ํจ์ A์ LexicalEnvironment
- ์ด์ฒ๋ผ outerEnvironmentReference๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ(linked list) ํํ๋ฅผ ๋ฑ๋๋ค.
์ ์ธ ์์ ์ LexicalEnvironment๋ฅผ ๊ณ์ ์ฐพ์ ์ฌ๋ผ๊ฐ๋ฉด ๋ง์ง๋ง์๋ ์ ์ญ ์ปจํ ์คํธ์ LexicalEnvironment๊ฐ ๋์ต๋๋ค.
๊ทธ๋์ ๊ฐ outerEnvironmentReference๋ ์ค์ง ์์ ์ด ์ ์ธ๋ ์์ ์ LexicalEnvironment๋ง ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์, ๊ฐ์ฅ ๊ฐ๊น์ด ์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ ๊ทผํ ์ ์๊ณ ๋ค๋ฅธ ์์๋ก ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ์ ํน์ฑ ๋๋ถ์ ์ฌ๋ฌ ์ค์ฝํ์์ ๋์ผํ ์๋ณ์๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ์ค์ฝํ ์ฒด์ธ ์์์ ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒฌ๋ ์๋ณ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
// ์์: ์ ์ญ ์ปจํ
์คํธ ํ์ฑํ (์ ์ธ ์์ ์ด ์์ผ๋ฏ๋ก outerEnvironmentReference๋ ๋น ๊ฐ)
// enviromnetRecord์{a, outer} ์๋ณ์ ์ ์ฅ
var a = 1; // ์ ์ญ ์ค์ฝํ์ a์ 1 ํ ๋น
var outer = function () {
// enviromnetRecord์ { inner } ์๋ณ์ ์ ์ฅ
var inner = function () {
// environmentRecord์ { a } ์๋ณ์ ์ ์ฅ
console.log(a); // environmentRecord์์ a๋ฅผ ๊ฒ์ => ์์ง ๊ฐ์ด ํ ๋น ๋์ง ์์ undefined ์ถ๋ ฅ
var a = 3;
}
inner(); // inner ์คํ ์ปจํ
์คํธ ํ์ฑํ => ์ ์ธ ๋น์์ธ outer์ LexicalEnvironment ์ฐธ์กฐ๋ณต์ฌ
console.log(a); // enviromnetRecord์์ a๋ฅผ ์ฐพ์๋ณด๋ ์์ => outerEnvironmentReference์ ์๋ enviromnetRecord๋ฅผ ํ์ => 1 ์ถ๋ ฅ
}
outer(); // outer ์คํ ์ปจํ
์คํธ ํ์ฑํ => ์ ์ธ ๋น์์ธ ์ ์ญ ์ปจํ
์คํธ์ LexicalEnvironment ์ฐธ์กฐ๋ณต์ฌ ์ฒซ๋ฒ์งธ๋ก ์คํ ์ปจํ
์คํธ์ ์ด๋ฆ, ๋๋ฒ์งธ๋ก environmentRecord ๊ฐ์ฒด(this: ์ ์ญ ๊ฐ์ฒด)
console.log(a);
ThisBinding
์๋ณ์๊ฐ ๋ฐ๋ผ๋ด์ผ ํ ๋์ ๊ฐ์ฒด์ ๋๋ค.
์ฆ, this๋ก ์ง์ ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
์คํ ์ปจํ ์คํธ ํ์ฑํ ๋น์์ this๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
this์ ๋ํด์๋ ํด๋น ๊ธ์์ ์์ธํ ๋ค๋ฃน๋๋ค.
์ ๋ฆฌ ๐
- ์คํ ์ปจํ
์คํธ๋ ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด
- ์ ์ญ ๊ณต๊ฐ์์ ์๋์ผ๋ก ์์ฑ๋๋ ์ ์ญ ์ปจํ ์คํธ
- eval()
- ํจ์ ์คํ์ ์ํ ์ปจํ ์คํธ
- ์คํ ์ปจํ
์คํธ๋ ํ์ฑํ๋๋ ์์ ์ ์ธ ๊ฐ์ง ์ ๋ณด๋ฅผ ์์ง
- VariableEnvironment: : environmentRecord, outerEnvironmnetReference๋ก ๊ตฌ์ฑ, ์ด๊ธฐ ์ํ๋ฅผ ์ ์งํจ.
- LexicalEnvironment: VariableEnvironment์ ๋์ผํ ๊ตฌ์ฑ, ํจ์ ์คํ ๋์ค์ ๋ณ๊ฒฝ๋๋ ์ฌํญ์ด ์ฆ์ ๋ฐ์
- ThisBinding
- environmentRecord๋ ๋งค๊ฐ๋ณ์๋ช , ๋ณ์์ ์๋ณ์, ์ ์ธํ ํจ์์ ํจ์ ๋ช ๋ฑ์ ์์ง
- outerEnvironmnet๋ ์ง์ ์ปจํ ์คํธ์ LexicalEnvironment ์ ๋ณด๋ฅผ ์ฐธ์กฐ
- environmentRecord์ ์์ง ๊ณผ์ ์ ์ถ์ํํ ๊ฐ๋ โก๏ธ ํธ์ด์คํ (hoisting)
- ์ค์ฝํ๋ ๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ๋ปํจ
- ์ฝ๋ ์์์ ์ด๋ค ๋ณ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ํ์ฌ ์ปจํ ์คํธ์ LexicalEnvironment๋ฅผ ํ์
- ์ ์ญ ์ปจํ ์คํธ์ LexicalEnvironment๊น์ง ๋๋ฌํด๋ ์ฐพ์ง ๋ชปํ๋ค๋ฉด undefined ๋ฐํ
- ์ ์ญ ๋ณ์ = ์ ์ญ ์ปจํ ์คํธ์ LexicalEnvironment์ ๋ด๊ธด ๋ณ์
- ์ง์ญ ๋ณ์ = ํจ์์ ์ํด ์์ฑ๋ ์คํ ์ปจํ ์คํธ์ ๋ณ์
- this์๋ ์คํ ์ปจํ ์คํธ๋ฅผ ํ์ฑํํ๋ ๋น์์ ์ง์ ๋ this๊ฐ ์ ์ฅ๋จ
์ฐธ๊ณ ๋ฌธํ: ์ฝ์ด์๋ฐ์คํฌ๋ฆฝํธ - ์คํ ์ปจํ ์คํธ