[JS] π μλ°μ€ν¬λ¦½νΈ μ€ν 컨ν μ€νΈ μ리
μ€ν 컨ν μ€νΈ
βμ€ν 컨ν μ€νΈ(Execution Context)λ scope, hoisting, this, function, closure λ±μ λμμ리λ₯Ό λ΄κ³ μλ μλ°μ€ν¬λ¦½νΈμ ν΅μ¬μ리μ΄λ€.
μ€ν 컨ν μ€νΈλ₯Ό λ°λ‘ μ΄ν΄νμ§ λͺ»νλ©΄ μ½λ λ ν΄κ° μ΄λ €μμ§λ©° λλ²κΉ λ λ§€μ° κ³€λν΄ μ§ κ²μ΄λ€.
β
μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μ€ννκΈ° μνμ¬ μ€νμ νμν μ¬λ¬κ°μ§ μ 보λ₯Ό μκ³ μμ΄μΌ νλ€.
μ€νμ νμν μ¬λ¬κ°μ§ μ 보λ μλμ κ°μ κ²λ€μ΄ μλ€.
- λ³μ : μ μλ³μ, μ§μλ³μ, 맀κ°λ³μ, κ°μ²΄μ νλ‘νΌν°
- ν¨μ μ μΈ
- λ³μμ μ ν¨λ²μ(Scope)
- this
μ΄μ κ°μ΄ μ€νμ νμν μ 보λ₯Ό νμννκ³ κ΅¬λΆνκΈ° μν΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ€ν 컨ν μ€νΈλ₯Ό 물리μ κ°μ²΄μ ννλ‘ κ΄λ¦¬νλ€.
β
μλμ μ½λλ₯Ό μ΄ν΄λ³΄μ.
var x = 'xxx';
function foo () {
var y = 'yyy';
function bar () {
var z = 'zzz';
console.log(x + y + z);
}
bar();
}
foo();
μ μ½λλ₯Ό μ€ννλ©΄ μλμ κ°μ΄ μ€ν 컨ν μ€νΈ μ€ν(Stack)μ΄ μμ±νκ³ μλ©Ένλ€.
νμ¬ μ€ν μ€μΈ 컨ν μ€νΈμμ μ΄ μ»¨ν μ€νΈμ κ΄λ ¨μλ μ½λ(μλ₯Ό λ€μ΄ λ€λ₯Έ ν¨μ)κ° μ€νλλ©΄ μλ‘μ΄ μ»¨ν μ€νΈκ° μμ±λλ€.
μ΄ μ»¨ν μ€νΈλ μ€νμ μμ΄κ² λκ³ μ»¨νΈλ‘€(μ μ΄κΆ)μ΄ μ΄λνλ€.
μ€ν 컨ν μ€νΈμ 3κ°μ§ κ°μ²΄
βμ€ν 컨ν μ€νΈλ μ€ν κ°λ₯ν μ½λλ₯Ό νμννκ³ κ΅¬λΆνλ μΆμμ μΈ κ°λ μ΄μ§λ§
물리μ μΌλ‘λ κ°μ²΄μ ννλ₯Ό κ°μ§λ©° μλμ 3κ°μ§ νλ‘νΌν°λ₯Ό μμ νλ€.
Variable Object (VO / λ³μκ°μ²΄)
μ€ν 컨ν μ€νΈκ° μμ±λλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ€νμ νμν μ¬λ¬ μ 보λ€μ λ΄μ κ°μ²΄λ₯Ό μμ±νλ€.
β
Variable Objectλ μλμ μ 보λ₯Ό λ΄λ κ°μ²΄μ΄λ€.
- λ³μ
- 맀κ°λ³μ(parameter)μ μΈμ μ 보(arguments)
- ν¨μ μ μΈ(ν¨μ ννμμ μ μΈ)
β
Variable Objectλ μ€ν 컨ν μ€νΈμ νλ‘νΌν°μ΄κΈ° λλ¬Έμ κ°μ κ°λλ° μ΄ κ°μ λ€λ₯Έ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
κ·Έλ°λ° μ μ μ½λ μ€νμ μμ±λλ μ μ 컨ν μ€νΈμ κ²½μ°μ ν¨μλ₯Ό μ€νν λ μμ±λλ ν¨μ 컨ν μ€νΈμ κ²½μ°, κ°λ¦¬ν€λ κ°μ²΄κ° λ€λ₯΄λ€.
μ΄λ μ μ μ½λμ ν¨μμ λ΄μ©μ΄ λ€λ₯΄κΈ° λλ¬Έμ΄λ€. μλ₯Ό λ€μ΄ μ μ μ½λμλ 맀κ°λ³μκ° μμ§λ§ ν¨μμλ 맀κ°λ³μκ° μλ€.
β
μ μ 컨ν μ€νΈμ κ²½μ°
Variable Objectλ μ μΌνλ©° μ΅μμμ μμΉνκ³ λͺ¨λ μ μ λ³μ, μ μ ν¨μ λ±μ ν¬ν¨νλ μ μ κ°μ²΄(Global Object / GO)λ₯Ό κ°λ¦¬ν¨λ€.
μ μ κ°μ²΄λ μ μμ μ μΈλ μ μ λ³μμ μ μ ν¨μλ₯Ό νλ‘νΌν°λ‘ μμ νλ€.
β
ν¨μ 컨ν μ€νΈμ κ²½μ°
Variable Objectλ Activation Object(AO / νμ± κ°μ²΄)λ₯Ό κ°λ¦¬ν€λ©° 맀κ°λ³μμ μΈμλ€μ μ 보λ₯Ό λ°°μ΄μ ννλ‘ λ΄κ³ μλ κ°μ²΄μΈ argumentκ°μ²΄κ° μΆκ°λλ€.
Scope Chain (SC)
μ€μ½ν 체μΈ(Scope Chain)μ βν΄λΉ μ μ λλ ν¨μκ° μ°Έμ‘°ν μ μλ λ³μ, ν¨μ μ μΈ λ±μ μ 보λ₯Ό λ΄κ³ μλ μ μ κ°μ²΄(GO) λλ νμ± κ°μ²΄(AO)μ 리μ€νΈλ₯Ό κ°λ¦¬ν¨λ€.
β
νμ¬ μ€ν 컨ν μ€νΈμ νμ± κ°μ²΄(AO)λ₯Ό μ λλ‘ νμ¬ μμ°¨μ μΌλ‘ μμ 컨ν μ€νΈμ νμ± κ°μ²΄(AO)λ₯Ό κ°λ¦¬ν€λ©° λ§μ§λ§ 리μ€νΈλ μ μ κ°μ²΄(GO)λ₯Ό κ°λ¦¬ν¨λ€.
μ€μ½ν 체μΈμ μλ³μ μ€μμ κ°μ²΄(μ μ κ°μ²΄ μ μΈ)μ νλ‘νΌν°κ° μλ μλ³μ, μ¦ λ³μλ₯Ό κ²μνλ λ©μ»€λμ¦μ΄λ€.β
μλ³μ μ€μμ λ³μκ° μλ κ°μ²΄μ νλ‘νΌν°(λ¬Όλ‘ λ©μλλ ν¬ν¨λλ€)λ₯Ό κ²μνλ λ©μ»€λμ¦μ νλ‘ν νμ 체μΈ(Prototype Chain)μ΄λ€.
* μλ³μ : λ³μλͺ ,ν¨μλͺ ,κ°μ²΄λͺ λ± μ΄λ¦μ λΆμΌλ μ¬μ©νλ λ¨μ΄
β
βμμ§μ μ€μ½ν 체μΈμ ν΅ν΄ λ μ컬 μ€μ½νλ₯Ό νμ νλ€.
ν¨μκ° μ€μ²© μνμΌ λ νμν¨μ λ΄μμ μμν¨μμ μ€μ½νμ μ μ μ€μ½νκΉμ§ μ°Έμ‘°ν μ μλλ° μ΄κ²λ μ€μ½ν 체μΈμ κ²μμ ν΅ν΄ κ°λ₯νλ€.
β
ν¨μκ° μ€μ²©λμ΄ μμΌλ©΄ μ€μ²©λ λλ§λ€ λΆλͺ¨ ν¨μμ Scopeκ° μμ ν¨μμ μ€μ½ν 체μΈμ ν¬ν¨λλ€.
ν¨μ μ€νμ€μ λ³μλ₯Ό λ§λλ©΄ κ·Έ λ³μλ₯Ό μ°μ νμ¬ Scope, μ¦ Activation Objectμμ κ²μν΄λ³΄κ³ , λ§μ½ κ²μμ μ€ν¨νλ©΄ μ€μ½ν 체μΈμ λ΄κ²¨μ§ μμλλ‘ κ·Έ κ²μμ μ΄μ΄κ°κ² λλ κ²μ΄λ€.
μ΄κ²μ΄ μ€μ½ν 체μΈμ΄λΌκ³ λΆλ¦¬λ μ΄μ μ΄λ€.
β
μλ₯Ό λ€μ΄ ν¨μ λ΄μ μ½λμμ λ³μλ₯Ό μ°Έμ‘°νλ©΄ μμ§μ μ€μ½ν 체μΈμ 첫λ²μ§Έ 리μ€νΈκ° κ°λ¦¬ν€λ AOμ μ κ·Όνμ¬ λ³μλ₯Ό κ²μνλ€. λ§μΌ κ²μμ μ€ν¨νλ©΄ λ€μ 리μ€νΈκ° κ°λ¦¬ν€λ Activation Object(λλ μ μ κ°μ²΄)λ₯Ό κ²μνλ€. μ΄μ κ°μ΄ μμ°¨μ μΌλ‘ μ€μ½ν 체μΈμμ λ³μλ₯Ό κ²μνλλ° κ²°κ΅ κ²μμ μ€ν¨νλ©΄ μ μλμ§ μμ λ³μμ μ κ·Όνλ κ²μΌλ‘ νλ¨νμ¬ Reference μλ¬λ₯Ό λ°μμν¨λ€.
β
μ€μ½ν 체μΈμ ν¨μμ νλ‘νΌν°μΈ [[Scope]]λ‘ μ°Έμ‘°ν μ μλ€.
this value
this νλ‘νΌν°μλ this κ°μ΄ ν λΉλλ€.
this ν λΉλλ κ°μ ν¨μ νΈμΆ ν¨ν΄μ μν΄ κ²°μ λλ€.
μ€ν 컨ν μ€νΈμ μμ± κ³Όμ
βμμμ μ΄ν΄λ³Έ μλμ μ½λλ₯Ό κ°μ§κ³ μ€μ λ‘ μ΄λ»κ² μ€ν 컨ν μ€νΈκ° μμ±λλμ§ μμ보μ.
var x = 'xxx';
function foo () {
var y = 'yyy';
function bar () {
var z = 'zzz';
console.log(x + y + z);
}
bar();
}
foo();
1. μ μ μ½λμμ μ§μ
컨νΈλ‘€μ΄ μ€ν 컨ν μ€νΈμ μ§μ νκΈ° μ΄μ μ μ μΌν μ μ κ°μ²΄(Global Object)κ° μμ±λλ€.
μ μ κ°μ²΄λ λ¨μΌ μ¬λ³ΈμΌλ‘ μ‘΄μ¬νλ©° μ΄ κ°μ²΄μ νλ‘νΌν°λ μ½λμ μ΄λ ν κ³³μμλ μ κ·Όν μ μλ€.
μ΄κΈ° μνμ μ μ κ°μ²΄μλ λΉνΈμΈ κ°μ²΄(Math, String, Array λ±)μ BOM, DOMμ΄ μ€μ λμ΄ μλ€.
μ μ κ°μ²΄κ° μμ±λ μ΄ν, μ μ μ½λλ‘ μ»¨νΈλ‘€μ΄ μ§μ νλ©΄ μ μ μ€ν 컨ν μ€νΈκ° μμ±λκ³ μ€ν 컨ν μ€νΈ μ€νμ μμΈλ€.
κ·Έλ¦¬κ³ μ΄ν μ΄ μ€ν 컨ν μ€νΈλ₯Ό λ°νμΌλ‘ μ΄νμ μ²λ¦¬κ° μ€νλλ€.
β
1) μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°ν
μ€ν 컨ν μ€νΈκ° μμ±λ μ΄ν κ°μ₯ λ¨Όμ μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°νκ° μ€νλλ€.
μ΄λ μ€μ½ν 체μΈμ μ μ κ°μ²΄μ λ νΌλ°μ€λ₯Ό ν¬ν¨νλ 리μ€νΈκ° λλ€.
β
β
2) Variable Instantiation(λ³μ κ°μ²΄ν) μ€ν
μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°νκ° μ’ λ£νλ©΄ λ³μ κ°μ²΄ν(Variable Instantiation)κ° μ€νλλ€.
λ³μ, 맀κ°λ³μμ μΈμ μ 보(arguments), ν¨μ μ μΈμ Variable Objectμ μΆκ°νμ¬ κ°μ²΄ν νλ€.
μ μ μ½λμ κ²½μ°, Variable Objectλ Global Objectλ₯Ό κ°λ¦¬ν¨λ€.
β
Variable Instantiation(λ³μ κ°μ²΄ν)λ μλμ μμλ‘ Variable Objectμ νλ‘νΌν°μ κ°μ setνλ€. (λ°λμ 1→2→3 μμλ‘ μ€νλλ€.)
1. (Function CodeμΈ κ²½μ°) 맀κ°λ³μ(parameter)κ° Variable Objectμ νλ‘νΌν°λ‘, μΈμ(argument)κ° κ°μΌλ‘ μ€μ λλ€.
β
2. λμ μ½λ λ΄μ ν¨μ μ μΈ(ν¨μ ννμ μ μΈ)μ λμμΌλ‘ ν¨μλͺ μ΄ Variable Objectμ νλ‘νΌν°λ‘, μμ±λ ν¨μ κ°μ²΄κ° κ°μΌλ‘ μ€μ λλ€.(ν¨μ νΈμ΄μ€ν )
β
3. λμ μ½λ λ΄μ λ³μ μ μΈμ λμμΌλ‘ λ³μλͺ μ΄ Variable Objectμ νλ‘νΌν°λ‘, undefinedκ° κ°μΌλ‘ μ€μ λλ€.(λ³μ νΈμ΄μ€ν )
βμ μμ μ½λλ₯Ό 보면 μ μ μ½λμ λ³μ xμ ν¨μ foo(맀κ°λ³μ μμ)κ° μ μΈλμλ€.
Variable Instantiationμ μ€ν μμ μ, μ°μ 2. ν¨μ fooμ μ μΈμ΄ μ²λ¦¬λκ³ (ν¨μ μ½λκ° μλ μ μ μ½λμ΄κΈ° λλ¬Έμ 1. 맀κ°λ³μ μ²λ¦¬λ μ€νλμ§ μλλ€.) κ·Έ ν 3. λ³μ xμ μ μΈμ΄ μ²λ¦¬λλ€.
β
β
3) ν¨μ fooμ μ μΈ μ²λ¦¬
ν¨μ μ μΈμ Variable Instantiation μ€ν μμ 2.μ κ°μ΄ μ μΈλ ν¨μλͺ fooκ° Variable Object(μ μ μ½λμΈ κ²½μ° Global Object)μ νλ‘νΌν°λ‘, μμ±λ ν¨μ κ°μ²΄κ° κ°μΌλ‘ μ€μ λλ€.
β
μμ±λ ν¨μ κ°μ²΄λ [[Scopes]] νλ‘νΌν°λ₯Ό κ°μ§κ² λλ€.
[[Scopes]] νλ‘νΌν°λ ν¨μ κ°μ²΄λ§μ΄ μμ νλ λ΄λΆ νλ‘νΌν°(Internal Property)λ‘μ ν¨μ κ°μ²΄κ° μ€νλλ νκ²½μ κ°λ¦¬ν¨λ€.
β
λ°λΌμ νμ¬ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ΄ μ°Έμ‘°νκ³ μλ κ°μ²΄λ₯Ό κ°μΌλ‘ μ€μ νλ€.
λ΄λΆ ν¨μμ [[Scopes]] νλ‘νΌν°λ μμ μ μ€ν νκ²½(Lexical Enviroment)κ³Ό μμ μ ν¬ν¨νλ μΈλΆ ν¨μμ μ€ν νκ²½κ³Ό μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λλ°,
μ΄λ μμ μ ν¬ν¨νλ μΈλΆ ν¨μμ μ€ν 컨ν μ€νΈκ° μλ©Ένμ¬λ [[Scopes]] νλ‘νΌν°κ° κ°λ¦¬ν€λ μΈλΆ ν¨μμ μ€ν νκ²½(Activation object)μ μλ©Ένμ§ μκ³ μ°Έμ‘°ν μ μλ€.
β
μ΄κ²μ΄ ν΄λ‘μ μ΄λ€.
β
μ§κΈκΉμ§ μ΄ν΄λ³Έ μ€ν 컨ν μ€νΈλ μμ§ μ½λκ° μ€νλκΈ° μ΄μ μ΄λ€.
νμ§λ§ μ€μ½ν 체μΈμ΄ κ°λ¦¬ν€λ λ³μ κ°μ²΄(VO)μ μ΄λ―Έ ν¨μκ° λ±λ‘λμ΄ μμΌλ―λ‘ μ΄ν μ½λλ₯Ό μ€νν λ ν¨μμ μΈμ μ΄μ μ ν¨μλ₯Ό νΈμΆν μ μκ² λμλ€.
μ΄λ μ μ μλ κ²μ ν¨μμ μΈμμ κ²½μ°, λ³μ κ°μ²΄(VO)μ ν¨μννμκ³Ό λμΌνκ² ν¨μλͺ μ νλ‘νΌν°λ‘ ν¨μ κ°μ²΄λ₯Ό ν λΉνλ€λ κ²μ΄λ€.
λ¨, ν¨μμ μΈμμ λ³μ κ°μ²΄(VO)μ ν¨μλͺ μ νλ‘νΌν°λ‘ μΆκ°νκ³ μ¦μ ν¨μ κ°μ²΄λ₯Ό μ¦μ ν λΉνμ§λ§
ν¨μ ννμμ μΌλ° λ³μμ λ°©μ(λμ€μ ν¨μ κ°μ²΄ ν λΉ)μ λ°λ₯Έλ€.
β
λ°λΌμ ν¨μμ μΈμμ κ²½μ°, μ μΈλ¬Έ μ΄μ μ ν¨μλ₯Ό νΈμΆν μ μλ€.
μ΄λ¬ν νμμ ν¨μ νΈμ΄μ€ν (Function Hoisting)μ΄λΌ νλ€.
console.log(a()); // 11
console.log(b()); // Uncaught TypeError: b is not a function
// νμ¬ VOμλ λ³μλ‘μ bκ° μ μ₯λμ΄μλ€. κ·Έλ¬λ b()νλ©΄ bλ ν¨μκ° μλλ€λΌκ³ λ¬λ€.
function a() {
return '11';
}
var b = function() {
return '22';
}
β
β
4) λ³μ xμ μ μΈ μ²λ¦¬
λ³μ μ μΈμ Variable Instantiation μ€ν μμ 3.κ³Ό κ°μ΄ μ μΈλ λ³μλͺ ( x )μ΄ Variable Objectμ νλ‘νΌν°λ‘, undefinedκ° κ°μΌλ‘ μ€μ λλ€.
β
μ΄κ²μ μ’λ μΈλΆν ν΄λ³΄λ©΄ μλμ κ°λ€.
μ μΈ λ¨κ³(Declaration phase)
λ³μ κ°μ²΄(Variable Object)μ λ³μλ₯Ό λ±λ‘νλ€. μ΄ λ³μ κ°μ²΄λ μ€μ½νκ° μ°Έμ‘°ν μ μλ λμμ΄ λλ€.
β
μ΄κΈ°ν λ¨κ³(Initialization phase)
λ³μ κ°μ²΄(Variable Object)μ λ±λ‘λ λ³μλ₯Ό λ©λͺ¨λ¦¬μ ν λΉνλ€. μ΄ λ¨κ³μμ λ³μλ undefinedλ‘ μ΄κΈ°νλλ€.
β
ν λΉ λ¨κ³(Assignment phase)
undefinedλ‘ μ΄κΈ°νλ λ³μμ μ€μ κ°μ ν λΉνλ€.
var ν€μλλ‘ μ μΈλ λ³μλ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° νλ²μ μ΄λ£¨μ΄μ§λ€.
β
λ€μ λ§ν΄ μ€μ½ν 체μΈμ΄ κ°λ¦¬ν€λ λ³μ κ°μ²΄μ λ³μκ° λ±λ‘λκ³ λ³μλ undefinedλ‘ μ΄κΈ°νλλ€.
λ°λΌμ λ³μ μ μΈλ¬Έ μ΄μ μ λ³μμ μ κ·Όνμ¬λ Variable Objectμ λ³μκ° μ‘΄μ¬νκΈ° λλ¬Έμ μλ¬κ° λ°μνμ§ μλλ€. λ€λ§ undefinedλ₯Ό λ°ννλ€.
β
μ΄λ¬ν νμμ λ³μ νΈμ΄μ€ν (Variable Hoisting)μ΄λΌνλ€.
console.log(a); // undefined
var a = 10;
console.log(a); // 10
console.log(a); // ReferenceError: a is not defined
let a = 10;
μμ§ λ³μ xλ ‘xxx’λ‘ μ΄κΈ°νλμ§ μμλ€.
μ΄ν λ³μ ν λΉλ¬Έμ λλ¬νλ©΄ λΉλ‘μ κ°μ ν λΉμ΄ μ΄λ£¨μ΄μ§λ€.
β
β
5) this value κ²°μ
λ³μ μ μΈ μ²λ¦¬κ° λλλ©΄ λ€μμ this valueκ° κ²°μ λλ€.
this valueκ° κ²°μ λκΈ° μ΄μ μ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ μλ€κ° ν¨μ νΈμΆ ν¨ν΄μ μν΄ thisμ ν λΉλλ κ°μ΄ κ²°μ λλ€.
μ μ μ½λμ κ²½μ°, thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
(μ μ 컨ν μ€νΈ(μ μ μ½λ)μ κ²½μ°, Variable Object, μ€μ½ν 체μΈ, this κ°μ μΈμ λ μ μ κ°μ²΄μ΄λ€.)
μ μ μ½λμ μ€ν
βμ§κΈκΉμ§λ μ½λ μ€ν νκ²½μ κ°μΆκΈ° μν μ¬μ μ€λΉμλ€. μ½λμ μ€νμ μ§κΈλΆν° μμλλ€.
var x = 'xxx';
function foo () {
var y = 'yyy';
function bar () {
var z = 'zzz';
console.log(x + y + z);
}
bar();
}
foo();
μ μμ λ₯Ό 보면 μ μ λ³μ xμ λ¬Έμμ΄ ‘xxx’ ν λΉκ³Ό ν¨μ fooμ νΈμΆμ΄ μ€νλλ€.
β
β
1) λ³μ κ°μ ν λΉ
μ μ λ³μ xμ λ¬Έμμ΄ ‘xxx’λ₯Ό ν λΉν λ, νμ¬ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ΄ μ°Έμ‘°νκ³ μλ Variable Objectλ₯Ό μ λ(0)λΆν° κ²μνμ¬ λ³μλͺ μ ν΄λΉνλ νλ‘νΌν°κ° λ°κ²¬λλ©΄ κ°(‘xxx’)μ ν λΉνλ€.
β
β
2) ν¨μ fooμ μ€ν
μ μ μ½λμ ν¨μ fooκ° μ€νλκΈ° μμνλ©΄ μλ‘μ΄ ν¨μ μ€ν 컨ν μ€νΈκ° μμ±λλ€.
ν¨μ fooμ μ€ν 컨ν μ€νΈλ‘ 컨νΈλ‘€μ΄ μ΄λνλ©΄ μ μ μ½λμ κ²½μ°μ λ§μ°¬κ°μ§λ‘
- μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°ν,
- Variable Instantiation μ€ν,
- this value κ²°μ
βμ΄ μμ°¨μ μΌλ‘ μ€νλλ€.
β
β
3) μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°ν
ν¨μ μ½λμ μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°νλ μ°μ Activation Objectμ λν λ νΌλ°μ€λ₯Ό μ€μ½ν 체μΈμ μ λμ μ€μ νλ κ²μΌλ‘ μμλλ€.
Activation Objectλ μ°μ arguments νλ‘νΌν°μ μ΄κΈ°νλ₯Ό μ€ννκ³ κ·Έ ν, Variable Instantiationκ° μ€νλλ€.
Activation Objectλ μ€ν μμ κ°λ μΌλ‘, νλ‘κ·Έλ¨μ΄ Activation Objectμ μ§μ μ κ·Όν μ μλ€. (Activation Objectμ νλ‘νΌν°λ‘μ μ κ·Όμ κ°λ₯νλ€)
β
κ·Έ ν, Caller(μ μ 컨ν μ€νΈ)μ Scope Chainμ΄ μ°Έμ‘°νκ³ μλ κ°μ²΄κ° μ€μ½ν 체μΈμ pushλλ€.
λ°λΌμ, μ΄ κ²½μ° ν¨μ fooλ₯Ό μ€νν μ§ν μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ Activation Object(ν¨μ fooμ μ€νμΌλ‘ λ§λ€μ΄μ§ AO-1)κ³Ό μ μ κ°μ²΄λ₯Ό μμ°¨μ μΌλ‘ μ°Έμ‘°νκ² λλ€.
β
β
4) Variable Instantiation λ³μ κ°μ²΄ν μ€ν
Function Codeμ κ²½μ°, μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°νμμ μμ±λ Activation Objectλ₯Ό Variable Objectλ‘μ Variable Instantiationκ° μ€νλλ€.
μ΄κ²μ μ μΈνλ©΄ μ μ μ½λμ κ²½μ°μ κ°μ μ²λ¦¬κ° μ€νλλ€.
μ¦, ν¨μ κ°μ²΄λ₯Ό Variable Object(AO-1)μ λ°μΈλ©νλ€. (νλ‘νΌν°λ bar, κ°μ μλ‘ μμ±λ Function Object. bar function objectμ [[Scope]] νλ‘νΌν° κ°μ AO-1κ³Ό Global Objectλ₯Ό μ°Έμ‘°νλ 리μ€νΈοΌ
β
yλ₯Ό Variable Object(AO-1)μ μ€μ νλ€ μ΄λ νλ‘νΌν°λ y, κ°μ undefinedμ΄λ€.
β
β
5) this value κ²°μ
λ³μ μ μΈ μ²λ¦¬κ° λλλ©΄ λ€μμ this valueκ° κ²°μ λλ€. thisμ ν λΉλλ κ°μ ν¨μ νΈμΆ ν¨ν΄μ μν΄ κ²°μ λλ€.
λ΄λΆ ν¨μμ κ²½μ°, thisμ valueλ μ μ κ°μ²΄μ΄λ€.
foo ν¨μ μ½λμ μ€ν
μ΄μ ν¨μ fooμ μ½λ λΈλ‘ λ΄ κ΅¬λ¬Έμ΄ μ€νλλ€. μ μμ λ₯Ό 보면 λ³μ yμ λ¬Έμμ΄ ‘yyy’μ ν λΉκ³Ό ν¨μ barκ° μ€νλλ€.
β
β
1) λ³μ κ°μ ν λΉ
μ§μ λ³μ yμ λ¬Έμμ΄ ‘yyy’λ₯Ό ν λΉν λ, νμ¬ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ΄ μ°Έμ‘°νκ³ μλ Variable Objectλ₯Ό μ λ(0)λΆν° κ²μνμ¬ λ³μλͺ μ ν΄λΉνλ νλ‘νΌν°κ° λ°κ²¬λλ©΄ κ° ‘yyy’λ₯Ό ν λΉνλ€.
λ³μ yμμ κ° ν λΉ
β
β
2) ν¨μ barμ μ€ν
ν¨μ barκ° μ€νλκΈ° μμνλ©΄ μλ‘μ΄ μ€ν 컨ν μ€νΈμ΄ μμ±λλ€.
β
β
μ΄μ ν¨μ fooμ μ€ν κ³Όμ κ³Ό λμΌνκ²
- μ€μ½ν 체μΈμ μμ±κ³Ό μ΄κΈ°ν,
- Variable Instantiation μ€ν,
- this value κ²°μ
μ΄ μμ°¨μ μΌλ‘ μ€νλλ€.
βμ΄ λ¨κ³μμ console.log(x + y + z); ꡬ문μ μ€ν κ²°κ³Όλ xxxyyyzzzκ° λλ€.
- x : AO-2μμ x κ²μ μ€ν¨ → AO-1μμ x κ²μ μ€ν¨ → GOμμ x κ²μ μ±κ³΅ (κ°μ ‘xxx’)
- y : AO-2μμ y κ²μ μ€ν¨ → AO-1μμ y κ²μ μ±κ³΅ (κ°μ ‘yyy’)
- z : AO-2μμ z κ²μ μ±κ³΅ (κ°μ ‘zzz’)
# μ°Έκ³ μλ£
http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/
http://davidshariff.com/blog/what-is-the-execution-context-in-javascript/
http://jibbering.com/faq/notes/closures/