π Chapter 2: μ€ν 컨ν μ€νΈ
- μ€ν 컨ν μ€νΈ(execution context)λ μ€νν μ½λμ μ 곡ν νκ²½ μ 보λ€μ λͺ¨μλμ κ°μ²΄λ‘, μλ°μ€ν¬λ¦½νΈμ λμ μΈμ΄λ‘μμ μ±κ²©μ κ°μ₯ μ νμ ν μ μλ κ°λ μ΄λ€.
- μλ°μ€ν¬λ¦½νΈλ μ΄λ€ μ€ν 컨ν
μ€νΈκ° νμ±νλλ μμ μ μ μΈλ λ³μλ₯Ό μλ‘ λμ΄μ¬λ¦¬κ³ (νΈμ΄μ€ν
), μΈλΆ νκ²½ μ 보λ₯Ό ꡬμ±νκ³ ,
this
κ°μ μ€μ νλ λ±μ λμμ μννλ€.
π μ€ν 컨ν μ€νΈλ?β
- μ€ν 컨ν μ€νΈ(execution context)λ μ€νν μ½λμ μ 곡ν νκ²½ μ 보λ€μ λͺ¨μλμ κ°μ²΄μ΄λ€.
- λμΌν νκ²½μ μλ μ½λλ€μ μ€νν λ νμν νκ²½ μ 보λ€μ λͺ¨μ 컨ν μ€νΈλ₯Ό ꡬμ±νκ³ , μ΄λ₯Ό μ½ μ€νμ μμμ¬λ Έλ€κ°, κ°μ₯ μμ μμ¬μλ 컨ν μ€νΈμ κ΄λ ¨ μλ μ½λλ€μ μ€ννλ μμΌλ‘ μ 체 μ½λμ νκ²½κ³Ό μμλ₯Ό 보μ₯νλ€.
// μ€ν 컨ν
μ€νΈμ μ½ μ€ν
// ------------------ (1)
var a = 1;
function outer() {
function inner() {
console.log(a); // undefined
var a = 3;
}
inner(); // ------------ (2)
console.log(a); // 1
}
outer(); // ------------ (3)
console.log(a); // 1
- μ μμ μ κ°μ΄ μ²μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννλ μκ°
(1)
μ μ 컨ν μ€νΈκ° μ½ μ€νμ λ΄κΈ΄λ€. μ΅μλ¨μ 곡κ°μ μ½λ λ΄λΆμμ λ³λμ μ€ν λͺ λ Ήμ΄ μμ΄λ λΈλΌμ°μ μμ μλμΌλ‘ μ€ννλ―λ‘ μλ°μ€ν¬λ¦½νΈ νμΌμ΄ μ΄λ¦¬λ μκ° μ μ 컨ν μ€νΈκ° νμ±νλλ€. - μ½ μ€νμλ μ μ 컨ν
μ€νΈ μΈμ λ€λ₯Έ λ©μ΄λ¦¬κ° μμΌλ―λ‘ μ μ 컨ν
μ€νΈμ κ΄λ ¨λ μ½λλ€μ μμ°¨λ‘ μ§ννλ€κ°
(3)
μμouter
ν¨μλ₯Ό νΈμΆνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μouter
μ λν νκ²½ μ 보λ₯Ό μμ§ν΄μouter
μ€ν 컨ν μ€νΈλ₯Ό μμ±ν ν μ½ μ€νμ λ΄λλ€. - μ½ μ€νμ 맨 μμ
outer
μ€ν 컨ν μ€νΈκ° λμΈ μνκ° λμΌλ―λ‘ μ μ 컨ν μ€νΈμ κ΄λ ¨λ μ½λμ μ€νμ μΌμ μ€λ¨νκ³ λμouter
μ€ν 컨ν μ€νΈμ κ΄λ ¨λ μ½λ, μ¦outer
ν¨μ λ΄λΆμ μ½λλ€μ μμ°¨μ μΌλ‘ μ€ννλ€. - λ€μ
(2)
μμinner
ν¨μμ μ€ν 컨ν μ€νΈκ° μ½ μ€νμ κ°μ₯ μμ λ΄κΈ°λ©΄outer
컨ν μ€νΈμ κ΄λ ¨λ μ½λμ μ€νμ μ€λ¨νκ³inner
ν¨μ λ΄λΆμ μ½λλ₯Ό μμλλ‘ μ§ννλ€. inner
ν¨μ λ΄λΆμμa
λ³μμ κ° 3μ ν λΉνκ³ λλ©΄inner
ν¨μμ μ€νμ΄ μ’ λ£λλ©΄μinner
μ€ν 컨ν μ€νΈκ° μ½ μ€νμμ μ κ±°λλ€. κ·Έ ν(2)
μ λ€μ μ€λΆν° μ΄μ΄μ μ€ννλ€.a
λ³μμ κ°μ μΆλ ₯νκ³ λλ©΄outer
ν¨μμ μ€νμ΄ μ’ λ£λμ΄outer
μ€ν 컨ν μ€νΈκ° μ½ μ€ν μμ μ κ±°λκ³ ν΄ μ€νμλ μ μ 컨ν μ€νΈλ§ λ¨μ μκ² λλ€.- κ·Έλ° λ€μ, μ€νμ μ€λ¨νλ
(3)
μ λ€μ μ€λΆν° μ΄μ΄μ μ€ννλ€.a
λ³μμ κ°μ μΆλ ₯νκ³ λλ©΄ μ μ 곡κ°μ λλ μ€νν μ½λκ° λ¨μ μμ§ μμ μ μ 컨ν μ€νΈλ μ κ±°λκ³ , μ½ μ€νμλ μλ¬΄κ² λ λ¨μ§ μμ μνλ‘ μ’ λ£λκ² λλ€.
- μ΄λ κ² μ΄λ€ μ€ν 컨ν
μ€νΈκ° νμ±νλ λ μλ°μ€ν¬λ¦½νΈ μμ§μ ν΄λΉ 컨ν
μ€νΈμ κ΄λ ¨λ μ½λλ€μ μ€ννλ λ° νμν νκ²½ μ 보λ€μ μμ§ν΄μ μ€ν 컨ν
μ€νΈ κ°μ²΄μ μ μ₯νλ€. μ΄ κ°μ²΄λ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ νμ©ν λͺ©μ μΌλ‘ μμ±ν λΆ κ°λ°μκ° μ½λλ₯Ό ν΅ν΄ νμΈν μ μλ€. μ¬κΈ°μ λ΄κΈ°λ μ 보λ€μ λ€μκ³Ό κ°λ€.
VariableEnvironment
: νμ¬ μ»¨ν μ€νΈ λ΄μ μλ³μλ€μ λν μ 보 + μΈλΆ νκ²½ μ 보. μ μΈ μμ μLexicalEnvironment
μ μ€λ μ·μΌλ‘, λ³κ²½ μ¬νμ λ°μλμ§ μμ.LexicalEnvironment
: μ²μμλVariableEnvironment
μ κ°μ§λ§ λ³κ²½ μ¬νμ΄ μ€μκ°μΌλ‘ λ°μλ¨.ThisBinding
:this
μλ³μκ° λ°λΌλ΄μΌ ν λμ κ°μ²΄.
π VariableEnvironmentβ
VariableEnvironment
μ λ΄κΈ°λ λ΄μ©μLexicalEnvironment
μ κ°μ§λ§ μ΅μ΄ μ€ν μμ μ€λ μ·μ μ μ§νλ€λ μ μ΄ λ€λ₯΄λ€.- μ€ν 컨ν
μ€νΈλ₯Ό μμ±ν λ
VariableEnvironment
μ μ 보λ₯Ό λ¨Όμ λ΄μ λ€μ, μ΄λ₯Ό κ·Έλλ‘ λ³΅μ¬ν΄μLexicalEnvironment
λ₯Ό λ§λ€κ³ , μ΄νμλLexicalEnvironment
λ₯Ό μ£Όλ‘ νμ©νλ€. VariableEnvironment
μLexicalEnvironment
μ λ΄λΆλenvironmentRecord
μouterEnvironmentReference
λ‘ κ΅¬μ±λΌ μλ€.
π LexicalEnvironmentβ
π environmentRecordμ νΈμ΄μ€ν β
environmentRecord
μλ νμ¬ μ»¨ν μ€νΈμ κ΄λ ¨λ μ½λμ μλ³μ μ 보λ€μ΄ μ μ₯λλ€. 컨ν μ€νΈλ₯Ό ꡬμ±νλ ν¨μμ μ§μ λ 맀κ°λ³μ μλ³μ, μ μΈν ν¨μκ° μμ κ²½μ° κ·Έ ν¨μ μ체,var
λ‘ μ μΈλ λ³μμ μλ³μ λ±μ΄ μλ³μμ ν΄λΉνλ€. 컨ν μ€νΈ λ΄λΆ μ 체λ₯Ό μ²μλΆν° λκΉμ§ μ νμ΄λκ°λ©° μμλλ‘ μμ§νλ€.- μ½λκ° μ€νλκΈ° μ μμλ λΆκ΅¬νκ³ μλ°μ€ν¬λ¦½νΈ μμ§μ μ΄λ―Έ ν΄λΉ νκ²½μ μν μ½λμ λ³μλͺ λ€μ λͺ¨λ μκ³ μκ² λλ€. κ·Έ λ§μ μ¦, μλ°μ€ν¬λ¦½νΈ μμ§μ μλ³μλ€μ μ΅μλ¨μΌλ‘ λμ΄μ¬λ €λμ λ€μ μ€μ μ½λλ₯Ό μ€ννλ€λΌκ³ μκ°ν΄λ λ¬Έμ μλ€. μ¬κΈ°μ νΈμ΄μ€ν μ΄λΌλ κ°λ μ΄ λ±μ₯νλ€.
πΆ νΈμ΄μ€ν κ·μΉβ
environmentRecord
μλ 맀κ°λ³μ, μ΄λ¦, ν¨μ μ μΈ, λ³μλͺ λ±μ΄ λ΄κΈ΄λ€.
// 맀κ°λ³μμ λ³μμ λν νΈμ΄μ€ν
function a() {
var x = 1; // μμ§ λμ 1(맀κ°λ³μ μ μΈ)
console.log(x); // (1)
var x; // μμ§ λμ 2(λ³μ μ μΈ)
console.log(x); // (2)
var x = 2; // μμ§ λμ 3(λ³μ μ μΈ)
console.log(x); // (3)
}
a();
environmentRecord
λ νμ¬ μ€νλ 컨ν μ€νΈμ λμ μ½λ λ΄μ μ΄λ€ μλ³μλ€μ΄ μλμ§μλ§ κ΄μ¬μ΄ μκ³ , κ° μλ³μμ μ΄λ€ κ°μ΄ ν λΉλ κ²μΈμ§λ κ΄μ¬μ΄ μλ€. λ°λΌμ λ³μλ₯Ό νΈμ΄μ€ν ν λ λ³μλͺ λ§ λμ΄μ¬λ¦¬κ³ ν λΉ κ³Όμ μ μλ μ리μ κ·Έλλ λ¨κ²¨λλ€. 맀κ°λ³μμ κ²½μ°μλ λ§μ°¬κ°μ§μ΄λ€.environmentRecord
μ κ΄μ¬μ¬μ λ§μΆ° μμ§ λμ 1, 2, 3μ μμλλ‘ λμ΄μ¬λ¦¬κ³ λλ©΄ λ€μκ³Ό κ°μ ννλ‘ λ°λλ€.
function a() {
var x; // μμ§ λμ 1μ λ³μ μ μΈ λΆλΆ
var x; // μμ§ λμ 2μ λ³μ μ μΈ λΆλΆ
var x; // μμ§ λμ 3μ λ³μ μ μΈ λΆλΆ
x = 1; // μμ§ λμ 1μ ν λΉ λΆλΆ
console.log(x); // (1)
console.log(x); // (2)
x = 2; // μμ§ λμ 3μ ν λΉ λΆλΆ
console.log(x); // (3)
}
a(1);
- μ΄μ νΈμ΄μ€ν
μ΄ λλ¬μΌλ μ€μ μ½λκ° μ€νλ μ°¨λ‘μ΄λ€.
- λ³μ
x
λ₯Ό μ μΈνκ³ μ΄λ λ©λͺ¨λ¦¬μμλ μ μ₯ν 곡κ°μ 미리 ν보νκ³ , ν보ν 곡κ°μ μ£Όμκ°μ λ³μx
μ μ°κ²°ν΄λλ€. - κ·Έ λ€μ λ³μ
x
λ₯Ό μ°¨λ‘λ‘ μ μΈνλ€. μ΄λ―Έ μ μΈλ λ³μx
κ° μ‘΄μ¬νλ 무μνλ€. x
μ 1μ ν λΉνλ€. μ°μ μ«μ 1μ λ³λμ λ©λͺ¨λ¦¬μ λ΄κ³ ,x
μ μ°κ²°λ λ©λͺ¨λ¦¬ 곡κ°μ μ«μ 1μ κ°λ¦¬ν€λ μ£Όμκ°μ μ λ ₯νλ€.x
λ₯Ό(1)
κ³Ό(2)
μμ 1μ΄ μΆλ ₯λλ€.x
μ 2λ₯Ό ν λΉνλ€. μ«μ 2λ₯Ό λ³λμ λ©λͺ¨λ¦¬μ λ΄κ³ , κ·Έ μ£Όμκ°μ λ μ±λ‘x
μ μ°κ²°λ λ©λͺ¨λ¦¬ 곡κ°μΌλ‘ κ°λ€. μ΄μ λ³μx
λ μ«μ 2λ₯Ό κ°λ¦¬ν€κ² λλ€.x
κ°(3)
μμ 2κ° μΆλ ₯λκ³ , μ΄μ ν¨μ λ΄λΆμ λͺ¨λ μ½λκ° μ€νλμΌλ―λ‘ μ€ν 컨ν μ€νΈκ° μ½ μ€νμμ μ κ±°λλ€.
- λ³μ
// ν¨μ μ μΈμ νΈμ΄μ€ν
function a() {
console.log(b); // (1)
var b = 'bbb'; // μμ§ λμ 1(λ³μ μ μΈ)
console.log(b); // (2)
function b () {} // μμ§ λμ 2(ν¨μ μ μΈ)
console.log(b); // (3)
}
a();
a
ν¨μλ₯Ό μ€ννλ μκ°a
ν¨μμ μ€ν 컨ν μ€νΈκ° μμ±λλ€. μ΄λ λ³μλͺ κ³Ό ν¨μ μ μΈμ μ 보λ₯Ό μλ‘ λμ΄μ¬λ¦°λ€. λ³μλ μ μΈλΆμ ν λΉλΆλ₯Ό λλμ΄ μ μΈλΆλ§ λμ΄μ¬λ¦¬λ λ°λ©΄ ν¨μ μ μΈμ ν¨μ μ 체λ₯Ό λμ΄μ¬λ¦°λ€.
function a() {
var b; // μμ§ λμ 1. λ³μλ μ μΈλΆλ§ λμ΄μ¬λ¦°λ€.
function b() {} // μμ§ λμ2. ν¨μ μ μΈμ μ 체λ₯Ό λμ΄μ¬λ¦°λ€.
console.log(b); // (1)
b = 'bbb'; // λ³μμ ν λΉλΆλ μλ μ리μ λ¨κ²¨λλ€.
console.log(b); // (2)
console.log(b); // (3)
}
a();
πΆ ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμβ
- ν¨μ μ μΈλ¬Έμ
function
μ μλΆλ§ μ‘΄μ¬νκ³ λ³λμ ν λΉ λͺ λ Ήμ΄ μλ κ²μ μλ―Ένκ³ , λ°λλ‘ ν¨μ ννμμ μ μνfunction
μ λ³λμ λ³μμ ν λΉνλ κ²μ λ§νλ€.
function a() { /* ... */} // ν¨μ μ μΈλ¬Έ.
var b = function () { /* ... */} // (μ΅λͺ
) ν¨μ ννμ
var c = function d() { /* ... */} // κΈ°λͺ
ν¨μ ννμ, ν¨μλͺ
μΌλ‘λ νΈμΆ λΆκ°
- ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμ
console.log(sum(1, 2));
console.log(multiply(3, 4));
function sum (a, b) { // ν¨μ μ μΈλ¬Έ sum
return a + b;
}
var multiply = function (a, b) { // ν¨μ ννμ multiply
return a * b;
}
- λ€μμ μ μ½λκ° νΈμ΄μ€ν μ λ§μΉ μνμ΄λ€.
var sum = function sum(a, b) { // ν¨μ μ μΈλ¬Έμ μ 체λ₯Ό νΈμ΄μ€ν
μ΄νλ€.
return a + b;
};
var multiply; // λ³μλ μ μΈλΆλ§ λμ΄μ¬λ¦°λ€.
console.log(sum(1, 2)); // 3
console.log(multiply(3, 4)); // multiply is not a function.
multiply = function (a, b) { // λ³μμ ν λΉλΆλ μλ μ리μ..
return a * b;
}
- μ μμμ
multiply
νΈμΆμ κ°μ΄ ν λΉλΌ μμ§ μλ€. λΉμ΄μλ λμμ ν¨μλ‘ μ¬κ²¨ μ€ννλΌκ³ λͺ λ Ήνλ€. λ°λΌμ multiply us not a functionμ΄λΌλ μλ¬ λ©μμ§κ° μΆλ ₯λλ€.
π μ€μ½ν, μ€μ½ν 체μΈ, outerEnvironmentReferenceβ
- μ€μ½ν(scope)λ μλ³μμ λν μ ν¨λ²μμ΄λ€.
- μ΄λ€ κ²½κ³ Aμ μΈλΆμμ μ μΈν λ³μλ Aμ μΈλΆλΏ μλλΌ Aμ λ΄λΆμμλ μ κ·Όμ΄ κ°λ₯νμ§λ§, Aμ λ΄λΆμμ μ μΈν λ³μλ μ€μ§ Aμ λ΄λΆμμλ§ μ κ·Όν μ μλ€.
- μλ³μμ μ ν¨λ²μλ₯Ό μμμλΆν° λ°κΉ₯μΌλ‘ μ°¨λ‘λ‘ κ²μν΄λκ°λ κ²μ μ€μ½ν 체μΈ(scope chain)μ΄λΌκ³ νλ€. κ·Έλ¦¬κ³ μ΄λ₯Ό κ°λ₯μΌ νλ κ²μ΄ λ°λ‘
LexicalEnvironment
μ λ λ²μ§Έ μμ§ μλ£μΈouterEnvironmentReference
μ΄λ€.
πΆ μ€μ½ν 체μΈβ
outerEnvironmentReference
λ νμ¬ νΈμΆλ ν¨μκ° μ μΈλ λΉμμLexicalEnvironment
λ₯Ό μ°Έμ‘°νλ€.- μλ₯Ό λ€μ΄, Aν¨μ λ΄λΆμ B ν¨μλ₯Ό μ μΈνκ³ λ€μ B ν¨μ λ΄λΆμ C ν¨μλ₯Ό μ μΈν κ²½μ°, ν¨μ Cμ
outerEnvironmentReference
λ ν¨μ BμLexicalEnvironment
λ₯Ό μ°Έμ‘°νλ€. ν¨μ BμLexicalEnvironment
μ μλouterEnvironmentReference
λ λ€μ ν¨μ Bκ° μ μΈλλ λ(A)μLexicalEnvironment
λ₯Ό μ°Έμ‘°νλ€. - μ΄μ²λΌ
outerEnvironmentReference
λ μ°κ²°λ¦¬μ€νΈ ννλ₯Ό λ€λ€. μ μΈ μμ μLexicalEnvironment
λ₯Ό κ³μ μ°Ύμ μ¬λΌκ°λ©΄ λ§μ§λ§μ μ μ 컨ν μ€νΈμLexicalEnvironment
κ° μμ κ²μ΄λ€. λν κ°outerEnvironmentReference
λ μ€μ§ μμ μ΄ μ μΈλ μμ μLexicalEnvironment
λ§ μ°Έμ‘°νκ³ μμΌλ―λ‘ κ°μ₯ κ°κΉμ΄ μμλΆν° μ°¨λ‘λλ‘λ§ μ κ·Όν μ μκ³ λ€λ₯Έ μμλ‘λ μ κ·Όνλ κ²μ λΆκ°λ₯νλ€. - μ΄λ° ꡬ쑰μ νΉμ± λλΆμ μ¬λ¬ μ€μ½νμμ λμΌν μλ³μλ₯Ό μ μΈνλ κ²½μ°μλ 무쑰건 μ€μ½ν μ²΄μΈ μμμ κ°μ₯ λ¨Όμ λ°κ²¬λ μλ³μμλ§ μ κ·Όμ΄ κ°λ₯νκ² λλκ²μ΄λ€.
// μ€μ½ν 체μΈ
var a = 1;
var outer = function () {
var inner = function () {
console.log(a);
var a = 3;
};
inner();
console.log(a);
};
outer();
console.log(a);
- μ μ 컨ν
μ€νΈκ° νμ±νλλ€. μ μ 컨ν
μ€νΈμ
environmentRecord
μ{a, outer}
μλ³μλ₯Ό μ μ₯νλ€. μ μ 컨ν μ€νΈλ μ μΈ μμ μ΄ μμΌλ―λ‘ μ μ 컨ν μ€νΈμouterEnvironmentReference