- Published on
Javascript Execution Context
- Author
- Name
- yceffort
λ€μ΄κ°κΈ°μ μμ λ μ’κ³ μ κ° λ§μ΄ μ°Έκ³ ν κΈμ΄ μ¬κΈ°μ μμ΅λλ€. μ΄κΈμ 보μλκ² λ«μ΅λλ€.
Table of Contents
- μλ°μ€ν¬λ¦½νΈ μ€ν컨ν μ€νΈ
μλ°μ€ν¬λ¦½νΈ μ€ν컨ν μ€νΈ
μ΄λ² ν¬μ€ν μΌλ‘ μλ°μ€ν¬λ¦½νΈ μ€ν 컨ν μ€νΈμ λν΄ μ¨μ ν μ΄ν΄νκΈΈ λ°λΌλ©° π€
μ€ν 컨ν μ€νΈμ μ μ
μ€ν 컨ν μ€νΈμ λν μ μλ μλμ²λΌ λνλ μλ€.
Execution context (abbreviated form β EC) is the abstract concept used by ECMA-262 specification for typification and differentiation of an executable code.
Execution Context (μ΄ν EC2)λ ECMA-262μμ λͺ μΈλμ΄ μλ μΆμμ μΈ κ°λ μΌλ‘, μ€νκ°λ₯ν μ½λλ₯Ό νμν νκ³ κ΅¬λΆνλλ° μ¬μ©λλ€.
μ¬κΈ° μ κΈ° λΈλ‘κ·Έλ₯Ό λ€μ€μκ³ λ€λ κ²°κ³Ό, λμ²΄λ‘ μ€ν κ°λ₯ν μ½λλ₯Ό μ€ννλλ° μμ΄ νμν νκ²½ μ λλ‘ μλ―Έλ₯Ό λΆμ¬νλ κ² κ°λ€. μ€ν κ°λ₯ν μ½λλ ν¬κ² μΈ μ’ λ₯κ° μλ€. κ·Έλ¬λ λ³΄ν΅ λ μ’ λ₯λ§ μ΄μΌκΈ° νλ€.
Global Code (aka μ μ μ½λ): νλ‘κ·Έλ¨ λ 벨μμ μ€νλλ μ½λλ‘, .js
νμΌ λλ λ‘컬 μΈλΌμΈ μ½λ (<script></script>
) λ±μ μλ―Ένλ€. μ μ μ½λλ μ΄λ ν ν¨μμ λ°λμ ν¬ν¨λμ§ μλλ€. μ½κ² μκΈ°ν΄μ μ μ λ 벨μ μ½λλ₯Ό μλ―Ένλ€. μ¬κΈ°μμ ECStackμ μλμ κ°μ΄ μμ±λλ€.
ECStack = [globalContext];
Function Code (aka ν¨μ μ½λ): ν¨μ μ½λμ μ§μ νκ² λμμ λ, ECStackμ μλ‘μ΄ μ리먼νΈκ° νΈμ¬λλ€. μ¬κΈ°μμ μ€μν κ²μ, ν¨μ λ΄λΆμ ν¨μ μ½λλ ν¬ν¨λμ§ μλ λ€λ κ²μ΄λ€. λ¬΄μ¨ λ§μΈκ³ νλ, μλ μ½λλ₯Ό μ΄ν΄λ³΄μ.
;(function foo(flag) {
if (flag) {
return
}
foo(true)
})(false)
μ΄μ ECStackμ μ΄λ κ² μμ λλ€.
// μ²μμ fooν¨μλ₯Ό μ€ννλ€κ°
ECStack = [
<foo> functionContext
globalContext
];
// μ¬κ·μ μΌλ‘ λ€μ fooλ₯Ό μ€ννλ€.
ECStack = [
<foo> functionContext β recursively
<foo> functionContext
globalContext
];
λͺ¨λ ν¨μμ return λ¬Έμ νμ¬ μ€ν 컨ν
μ€νΈλ₯Ό λλ΄λ©°, (μλ¬λ₯Ό λμ Έλ throw Error
λλκΈ΄ νλ€.) μ΄μ λ°λΌ ECStack
μμ pop()
λλ€. μ΄λ° κ³Όμ μ κ±°μΉλ€λ³΄λ©΄, κ²°κ΅ ECStack
μ νλ‘κ·Έλ¨ μ’
λ£μμ μ globalStack
λ§ λ¨κ² λλ€.
Eval
Code: μλ°μ€ν¬λ¦½νΈ μκ°μ μ°μ§λ§λΌκ³ μ μ λΉλΆνλ κ·Έ μ½λλ€. κ΅³μ΄ μΈμΌμ΄ μμΌλ μμΈν μ€λͺ
μ μλ΅νλ€.
μ무νΌ, μ€ν κ°λ₯ν μ½λλ μ΄λ κ² 3μ’ λ₯κ° μλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ, μ½λ μ€νμ μν΄ μ¬λ¬κ°μ§ μ 보λ₯Ό μκ³ μμ΄μΌ νλ€. μ΄λ¬ν μ 보μλ λ€μκ³Ό κ°μ κ²λ€μ΄ μλ€.
- λ³μ: μ μ, μ§μ, λ§€κ°λ³μ, κ°μ²΄μ μμ± λ±
- ν¨μ μ μΈ
- λ³μμ μ ν¨λ²μ (scope)
- this
μλ μ½λ μμ λ₯Ό μ΄ν΄λ³΄μ.
var x = 1
function foo() {
var arg = arguments
var y = 2
function bar() {
var z = 3
console.log(x + y + z)
}
bar()
}
foo()
μ μ½λλ₯Ό μ€ννλ©΄, μ€ν컨ν μ€νΈ μ€νμ΄ μλμ κ°μ΄ μμ±λκ³ μλ©Έλλ€. νμ¬ μ€νμ€μΈ 컨ν μ€νΈμμ μ΄ μ»¨ν μ€νΈμ κ΄λ ¨μλ μ½λκ° μ€νλλ©΄, μλ‘μ΄ μ»¨ν μ€νΈλ₯Ό λ§λ λ€. μ΄ μ»¨ν μ€λ₯Ό μ€νμ μκ³ , μ μ΄κΆμ μ΄ μΆκ°λ 컨ν μ€νΈμ μ΄λλλ€.
1. [global EC]
2. [global EC, foo() EC]
3. [global EC, foo() EC, bar() EC]
4. [global EC, foo() EC]
5. [global EC]
- λͺ¨λκ° μλ κ²μ²λΌ, μ€ν 컨ν μ€νΈλ μ€ν ꡬ쑰λ€. (LIFO)
- μ μ 컨ν μ€νΈλ μ μ΄κΆμ΄ μ§μ νλ©΄ μμ±λκ³ , μ€ν컨ν μ€νΈλ μμ²λΌ μμ±λκ³ λΉ μ§κΈΈ λ°λ³΅νλ©°, μ μ 컨ν μ€νΈλ μ ν리μΌμ΄μ μ’ λ£ μμ κΉμ§ μ μ§λλ€.
- ν¨μλ₯Ό νΈμΆνλ©΄ ν΄λΉ ν¨μμ 컨ν μ€νΈλ₯Ό λ§λ€κ³ , μ€ν컨ν μ€νΈ μ€νμ μλλ€
- ν¨μμ€νμ΄ λλλ©΄ μ΄λ₯Ό
pop()
νκ³ μ΄ μ§μ μ€ν컨ν μ€νΈμ μ μ΄κΆμ λκΈ΄λ€.
μ€ν 컨ν μ€νΈμ ꡬμ±μμ
μ€ν컨ν μ€νΈλ 물리μ μΌλ‘ κ°μ²΄μ ννλ₯Ό κ°μ§λ©°, 3κ°μ§ νλ‘νΌν°λ₯Ό κ°μ§κ³ μλ€.
- Variable Object (λ³μκ°μ²΄)
- Scope Chain (μ€μ½ν 체μΈ)
- this
Variable Object (λ³μκ°μ²΄)
μ€ν컨ν μ€νΈκ° μμ±λλ©΄, μ€νμ νμν μ¬λ¬μ 보λ₯Ό λ΄μ κ°μ²΄λ₯Ό μμ±νλλ° μ΄λ₯Ό λ³μκ°μ²΄λΌκ³ νλ€. λ³μκ°μ²΄λ μλ μΈκ°μ§ μ 보λ₯Ό λ΄λλ€.
- λ³μ
- Parameter & Arguments
- ν¨μ μ μΈ (μ€λ‘μ§ μ μΈλ§)
νλΌλ―Έν°λ ν¨μμ λκΈ°κ²λ κ°λ€μ aliasκ³ , argumentλ parameterμ λκΈ°λ κ°μ μλ―Ένλ€.
λ³μ κ°μ²΄λ, μ€ν 컨ν μ€νΈμ νλ‘νΌν°μ΄κΈ° λλ¬Έμ λ€λ₯Έ κ°μ²΄λ₯Ό κ°λ₯΄ν€λ κ°μ κ°λλ€. κ·Έλ¦¬κ³ μ μ 컨ν μ€νΈμ ν¨μ 컨ν μ€νΈμ κ²½μ°μλ κ°κ° κ°λ₯΄ν€λ κ°μ²΄κ° λ€λ₯΄λ€. μλ₯Ό λ€μ΄ ν¨μ 컨ν μ€νΈμλ λ§€κ°λ³μκ° μλ€.
μ μ 컨ν μ€νΈμ λ³μ κ°μ²΄
μ΅μμμ μμΌλ©°, λͺ¨λ μ μ λ³μ λ° μ μ ν¨μλ±μ ν¬ν¨νλ μ μ κ°μ²΄ (Global Object)λ₯Ό κ°λ₯΄ν¨λ€. μ μκ°μ²΄λ μ μμ μ μΈλ λͺ¨λ μ μ λ³μμ μ μν¨μλ₯Ό νλ‘νΌν°λ‘ μ μΈνλ€.
μ μμ μμ μ μμΌλ‘ μ μΈλ κ²μ ν¨μ κ°μ²΄μΈ fooμ 1μ κ°μ κ°μ§ xκ° λ κ²μ΄λ€.
ν¨μ 컨ν μ€νΈμ λ³μ κ°μ²΄
ν¨μ 컨ν μ€νΈμ λ³μ κ°μ²΄λ Activation Object(νμ± κ°μ²΄)λ₯Ό κ°λ¦¬ν€λ©°, μΈμλ€μ μ 보λ₯Ό λ°°μ΄λ‘ λ΄κ³ μλ argument objectκ° μΆκ°λλ€.
foo()
λ₯Ό μλ‘ λ€μ΄λ³΄μ. λ³μ y, bar()
κ·Έλ¦¬κ³ μΈλΆμμ νλΌλ―Έν°λ₯Ό ν΅ν΄ μ λ¬ λ°μ arguments
κ° μΆκ°λλ€.
μ€μ½ν μ²΄μΈ (Scope chain)
μ¬κΈ°μ κΈ°μ μ΄λ ΅κ² μ€λͺ λμ΄ μμ΄μ ν·κ°λ Έλλ° - μ€μ½ν체μΈμ μ μ λλ ν¨μκ° μ°Έμ‘°ν μ μλ λ³μ, ν¨μμ μΈλ±μ μ 보λ₯Ό λ΄κ³ μλ μ μκ°μ²΄λ νμ±κ°μ²΄μ 리μ€νΈλ₯Ό λ§νλ€.
λ§μ΄ μ΄λ €μ°λ, μ½κ² μ΄μΌκΈ° ν΄λ³΄μ.
foo()
ν¨μλ μμ arguments
, bar()
, y
λ₯Ό κ°λ₯΄ν€κ³ μλ νμ±κ°μ²΄λ₯Ό λ³μκ°μ²΄λ‘ κ°μ§κ³ μλ€. μ€μ½ν 체μΈμ μ΄ νμ±κ°μ²΄κ° λ€μ΄κ° μλ€.
κ·Έλ¦¬κ³ κ·Έ λ€μμΌλ‘ μμ 컨ν
μ€νΈμ νμ± κ°μ²΄λ₯Ό κ°λ₯΄ν€κ³ μλ€. foo()
μ μμ κ°μ²΄λ μ μ 컨ν
μ€νΈμ λ³μκ°μ²΄μΈ μ μκ°μ²΄λ€.
κ²°λ‘ μ μΌλ‘ foo()
μ μ€μ½ν체μΈμ κ°κ° foo()
μ AO
, κ·Έλ¦¬κ³ global
μ GO
λ₯Ό κ°μ§κ³ μκ² λλ€.
μ μ κ°μ²΄λ μ΄λ¨κΉ? μ μ κ°μ²΄λ κ°μ₯ μ΅μμ μ΄λ―λ‘, μ€λ‘μ§ GO
λ§μ μ€μ½ν체μΈμ 보κ΄νκ² λλ€.
κ²°λ‘ μ μΌλ‘, μ€μ½ν 체μΈμ λ³μ κ°μ²΄λ₯Ό κ²μνλ λ©μ»€λμ¦μ΄λ€.
μμ§μ μ€μ½ν 체μΈμ νμ©ν΄μ λ μ컬 μ€μ½νλ₯Ό νμ
νλ€. ν¨μκ° foo()
μ²λΌ μ€μ²©λμ΄ μμλ, νμν¨μ μμμ μμν¨μ, μ¬μ§μ΄ μ μ μ€μ½ν κΉμ§ μ°Έμ‘°ν μ μλ건 μ΄κ²μ μ€μ½ν 체μΈμ΄ μκΈ° λλ¬Έμ κ°λ₯ν κ²μ΄λ€. ν¨μ μ€νμ€μ λ³μλ₯Ό λ§λλ©΄ κ·Έλ³μλ₯Ό νμ¬ μ€μ½νμΈ AO
μμ κ²μν΄λ³΄κ³ , κ²μμ μ€ν¨νλ©΄ μ€μ½ν체μΈμ μμλλ‘ νλ¨κ³μ© μλ‘ κ²μμ μ΄μ΄κ°κ² λλ€.
κ·Έλ¬λ μ΄λ κ² μμ°¨μ μΌλ‘ κ²μνλλ° μ€ν¨νλ€λ©΄, μ μλμ§ μλ λ³μμ μ κ·Όνλ κ²μΌλ‘ μΈμνκ³ μ μλ μλ¬μΈ Referenceμλ¬κ° λκ² λλ€.
μμ μ½λμ debuggerλ₯Ό μΆκ°ν΄μ ν¬λ‘¬ μ½μμμ μ€νν΄λ³΄λ©΄ μμμ μ€λͺ ν λ΄μ©μ λ³Ό μκ° μλ€.
debugger
var x = 1
function foo() {
console.log('foo arguments', arguments)
var y = 2
function bar() {
var z = 3
console.log(x + y + z)
}
bar()
}
foo()
this
this νλ‘νΌν°μλ this κ°μ΄ ν λΉλλ€. this κ°μ ν¨μκ° μ΄λ»κ² νΈμΆλλλμ λ°λΌ κ²°μ λλ€. thisμ λν μμΈν μ΄μΌκΈ°λ λμ€μ λ€λ€λ³΄λλ‘ νμ.
μ€ν 컨ν μ€νΈκ° μ€νλλ κ³Όμ
μλ μ½λλ₯Ό κΈ°μ€μΌλ‘ μ΄ν΄λ³΄μ.
debugger
var x = 1
function foo(hello) {
var h = arguments[0]
var y = 2
function bar() {
var z = 3
console.log(x + y + z)
}
bar()
}
foo('hello')
1. μ μ κ°μ²΄ μμ±
μ μ€μ·μμ λ³Ό μ μλ κ²μ²λΌ, μ μ κ°μ²΄ (global object, μ¬κΈ°μλ window)κ° μμ±λ κ²μ λ³Ό μ μλ€. κ·Έλ¦¬κ³ μ΄ κ°μ²΄μ μλ νλ‘νΌν°λ μ΄λμμλ μ κ·Όν μ μλ€. κ·Έλ¦¬κ³ μ΄ windowμλ μ¨κ° λΉνΈμΈ κ°μ²΄, DOM, BOM λ±μ΄ μ€μ λμ΄ μλ κ²μ λ³Ό μ μλ€.
2. μ μ μ½λλ‘ μ»¨νΈλ‘€ μ§μ
μ μ μ½λλ‘ μ»¨νΈλ‘€μ΄ μ§μ νλ©΄ μ΄μ μ μ μ€ν 컨ν μ€νΈκ° μμ±λκ³ , μ΄ μ μ μ€ν 컨ν μ€νΈλ μ€ν 컨ν μ€νΈ μ€νμ μμΈλ€.
ECStack = [globalContext -> {VO, SC, this}];
μ΄λ κ² μκΈ΄ μ½λλ μμΌλ κ·Έλ₯ λλλ§ λ³΄λ©΄ λ κ² κ°λ€
2-1. μ€μ½ν μ²΄μΈ μμ± λ° μ΄κΈ°ν
μ€ν 컨ν μ€νΈκ° μμ±λκ³ κ°μ₯ λ¨Όμ νλ μΌμ, μ€μ½ν 체μΈμ μμ±νκ³ μ΄κΈ°ν νλ κ²μ΄λ€. μ¬κΈ°μμλ μ μ μ€ν 컨ν μ€νΈμ΄λ―λ‘, μ€μ½ν 체μΈμ κΈΈμ΄ 1μ 리μ€νΈλ‘ Global Objectλ₯Ό κ°λ₯΄ν€κ² λλ€.
2-2. λ³μ κ°μ²΄ν (Variable Instantiation) μ€ν
μμ
μ€μ½ν 체μΈμ΄ μμ±λκ³ μ΄κΈ°ν λλ©΄ λ³μ κ°μ²΄νκ° μ€νλλλ° μ΄λ Value Objectμ κ°μ μΆκ°νλ κ²μ λ§νλ€. μ μ μ½λμ κ²½μ°μλ Variable Objectλ 1λ²μμ μμ±νκ³ 2λ²μμ κ°λ₯΄ν€λ Global Objectλ€. κ·Έλ¦¬κ³ μλμ κ°μ μμλ‘ κ°μ μΈν νλ€.
- ν¨μμ½λμΈ κ²½μ° parameterκ° value objectμ νλ‘νΌν°λ‘, argumentκ° κ°μΌλ‘ μ€μ λλ€.
- ν¨μ μ μΈμ λμμΌλ‘ ν¨μλͺ μ΄ value objectμ νλ‘νΌν°λ‘, μμ±λ ν¨μ κ°μ²΄κ° κ°μΌλ‘ μ€μ λλ€. = ν¨μμ νΈμ΄μ€ν
- λ³μ μ μΈμ λμμΌλ‘ λ³μλͺ μ΄ value objectμ νλ‘νΌν°λ‘, undefinedκ° κ°μΌλ‘ μ€μ λλ€. = λ³μμ νΈμ΄μ€ν
μ μ€μ·μ 보μ.
- 1λ²μ λ°λΌμ hello νλΌλ―Έν°μ κ°μ΄ 'hello' argumentλ‘ μ€μ λμ΄ μλ€.
- 2λ²μ λ°λΌμ barκ°
f bar()
λ₯Ό κ°λ₯΄ν€κ³ μλ€. - 3λ²μ λ°λΌμ y, hκ° undefinedλ‘ μΈν λμ΄ μλ€.
ν¨μ μ μΈμ μ²λ¦¬
κ·Έ λ€μ λμ¬κ²¨ λ΄μΌ ν κ²μ ν¨μ μ μΈ μ²λ¦¬λ€. μμ±λ ν¨μ κ°μ²΄λ [[Scopes]]
νλ‘νΌν°λ₯Ό κ°κ² λλ€. μ΄λ ν¨μλ§μ΄ μμ νλ νλ‘νΌν°λ‘, ν¨μ κ°μ²΄κ° μ€νλλ νκ²½μ κ°λ¦¬ν¨λ€.
μ¬κΈ°μμ fooν¨μλ [[Scopes]]
λ‘ Globalμ κ°λ₯΄ν€κ³ μλ€. κ·Όλ° μ κΉ, μ΄κ±° μ΄λμ λ³Έκ² κ°μλ°, μΆμλλ° μ¬κΈ°μ 0λ²μ Global
μ μ€μ½ν 체μΈμ 0λ²μ μλ Globalκ³Ό κ°λ€. μ°λ¦¬λ μ¬κΈ°μ [[Scopes]]
κ° ν¨μ κ°μ²΄κ° μ€νλλ νκ²½μ κ°μ§κ³ μλ€λ κ²μ μ μ μλ€.
λ΄λΆ ν¨μμ [[Scopes]]
λ κ²°λ‘ μ μΌλ‘
- νμ¬ μμ μ μ€ννκ²½
- μμ μ ν¬ν¨νλ μΈλΆν¨μμ μ€ννκ²½
- μ μ κ°μ²΄
λ₯Ό κ°λ₯΄ν€κ² λλ€. μ¬κΈ°μ μμ μ μ€ννκ²½κ³Ό μΈλΆ μ€νν¨μμ μ€ν컨ν
μ€νΈκ° μλ©Έν΄λ, [[Scopes]]
κ° κ°λ¦¬ν€λ μΈλΆ ν¨μμ μ€ννκ²½μ μλ©Έλμ§ μκ³ μ°Έμ‘°ν μ μλλ°, μ΄λ₯Ό ν΄λ‘μ Έ λΌκ³ νλ€.
ν¨μ μ μΈμμ (μΌλ°μ μΈ function hello() {...}
) ν¨μλͺ
μ νλ‘νΌν°λ‘ ν¨μ κ°μ²΄λ₯Ό ν λΉνλ€. κ·Έλ¦¬κ³ VOμ ν¨μλͺ
μ νλ‘νΌν°λ‘ μΆκ°νκ³ μ¦μ ν λΉνλ€.
κ·Έλ¬λ ν¨μ ννμμ const hello = function () {...}
μΌλ°μ μΈ λ³μμ λ°©μμ λ°λ₯Έλ€. λ°λΌμ μ μΈμμ ν¨μλ₯Ό μ μΈνκΈ° μ΄μ μ ν¨μλ₯Ό νΈμΆν μ μλ€.
μ΄κ²μ ν¨μμ νΈμ΄μ€ν μ΄λΌκ³ νλ€.
λ³μ μ μΈμ μ²λ¦¬
λ³μ μ μΈμ μΈλΆν νλ©΄ μλμ κ°λ€.
- μ μΈλ¨κ³: λ³μκ°μ²΄μ λ³μλ₯Ό λ±λ‘νλ€. λ³μκ°μ²΄λ μ΄μ μ€μ½νκ° μ°Έμ‘°ν μ μκ² λλ€
- μ΄κΈ°ν λ¨κ³: λ³μκ°μ²΄μ λ±λ‘λ λ³μλ₯Ό λ©λͺ¨λ¦¬μ ν λΉνλ€. λ³μλ undefinedλ‘ μ μΈλλ€.
- ν λΉλ¨κ³: undefinedλ‘ μ΄κΈ°ν λ λ³μμ μ€μ κ°μ ν λΉλλ€.
var
ν€μλλ μ μΈκ³Ό μ΄κΈ°νκ° νλ²μ μ΄λ£¨μ΄μ§λ€. μ¦ λ³μλ±λ‘κ³Ό μ΄κΈ°νκ° νλ²μ μ΄λ£¨μ΄μ§λ€. λ°λΌμ λ³μ μ μΈ μ΄μ μ μ κ·Όνμ¬λ Variable Objectμ λ³μκ° μ΄λ―Έ μ‘΄μ¬νκ³ μκΈ° λλ¬Έμ μλ¬κ° λ°μνμ§ μκ³ undefinedκ° λ¦¬ν΄λλ€.
μ΄λ₯Ό λ³μμ νΈμ΄μ€ν μ΄λΌκ³ νλ€.
μ μ μ½λμ μ€ν
μ½λ μ€νμ μν μ€λΉκ° λλ¬μΌλ―λ‘, μ΄μ μ½λκ° μ€νλλ€.
var x = 1
function foo(hello) {
var h = arguments[0]
var y = 2
function bar() {
var z = 3
console.log(x + y + z)
}
bar()
}
foo('hello')
μ μμ μμλ μ μλ³μ xμ μ«μ ν λΉκ³Ό, ν¨μ foo()
μ νΈμΆμ΄ μ€νλλ€.
λ³μμ κ° ν λΉ
μ μλ³μ xμ μ«μλ₯Ό ν λΉνκΈ° μν΄μ, μ€ν 컨ν
μΉνΈλ μ€μ½ν체μΈμ΄ μ°Έκ³ νκ³ μλ Variable Objectλ₯Ό κ²μνκΈ° μμνλ€. x
λ₯Ό λ°κ²¬νλ©΄ κ° xxx
λ₯Ό ν λΉνλ€.
ν¨μμ μ€ν
κ·Έλ¦¬κ³ ν¨μ foo()
λ₯Ό μ€ννκ² λλ€. ν¨μλ₯Ό μ€ννκΈ° μμνλ©΄, μλ‘μ΄ ν¨μ μ€ν 컨ν
μ€νΈκ° μμ±λλ€. μ΄μ λμμ 컨νΈλ‘€μ΄ ν¨μ foo
λ‘ μ΄λνλ©΄μ, μ μ μ½λμ λ§μ°¬κ°μ§λ‘
- μ€μ½ν 체μΈμ μμ± λ° μ΄κΈ°ν
- Variable Instantiation μ€ν
- this value κ²°μ
μ΄ μμ°¨μ μΌλ‘ μ€νλλ€. μμ λ§ν κ²μ²λΌ νκ°μ§ μ°¨μ΄μ μ - μ μμ½λκ° μλ ν¨μμ½λλΌλ μ μ΄λ€.
μ€μ½ν μ²΄μΈ μμ± λ° μ΄κΈ°ν
μ°μ Activation Objectμ λν λ νΌλ°μ€λ₯Ό μ€μ½ν 체μΈμ μΆκ°νλ κ²μΌλ‘ μμλλ€. κ°μ₯ λ¨Όμ arguments νλ‘νΌν°λ₯Ό μ΄κΈ°ν νν, κ·Έλ€μμ Variable Instantiationμ΄ μ€νλλ€.
κ·Έ ν, μ€μ½ν체μΈμ΄ μ°Έμ‘°νκ³ μλ κ°μ²΄κ° μ€μ½ν 체μΈμ μΆκ°λ‘ μΆκ°λλ€. μ΄ κ²½μ°μλ μ€μ½ν체μΈμ μμ μΆκ°ν Activation Objectμ λλ²μ§Έλ‘ Global Objectλ₯Ό μμ°¨μ μΌλ‘ μ°Έμ‘°νκ² λλ€.
Variable Instantiation μ€ν
μμ λ§λ Activation Objectλ₯Ό Variable Objectλ‘μ μ€νλλ€.
λ¨Όμ foo
ν¨μ μμ μλ bar
λ₯Ό λ°μΈλ©νλ€. κ·Έλ¦¬κ³ μ΄ λ bar
μ [[Scopes]]
μ κ°μ GOμ AOλ₯Ό μ°Έμ‘°νλ 리μ€νΈκ° λλ€.
λ³μ yλ₯Ό Variable Objectμ μ€μ νλ€. μ΄ λ νλ‘νΌν°μ κ°μ y, κ°μ undefined λ€.
this κ²°μ
thisλ ν¨μ νΈμΆ ν¨ν΄μ μν΄ κ²°μ λλ€. λ΄λΆ ν¨μλ, this λ μ μ κ°μ²΄λ€.
foo ν¨μμ μ€ν
κ° ν λΉ
yμ 2λ₯Ό ν λΉνκΈ° μν΄, μ€μ½ν 체μΈμ νμνλ©΄μ κ²μνλ€. λ³μλͺ yμ ν΄λΉνλ νλ‘νΌν°κ° λ°κ²¬λλ©΄ 2λ₯Ό ν λΉνλ€.
bar ν¨μμ μ€ν
barν¨μλ₯Ό μ€ννκΈ° μμνλ©΄, μλ‘μ΄ μ€ν 컨ν μ€νΈκ° μμ±λλ€.μ¬κΈ°μλ μμ λ§μ°¬κ°μ§λ‘ μ€μ½ν μ²΄μΈ μμ± λ° μ΄κΈ°ν, Variable Instantiation μ€ν, this value κ²°μ μ΄ μμ°¨μ μΌλ‘ μ€νλλ€.