λ€μ΄κ°λ©° π
μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄ν΄νλ λ° μμ΄μ μ€ν 컨ν μ€νΈ(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κ° μ μ₯λ¨
μ°Έκ³ λ¬Έν: μ½μ΄μλ°μ€ν¬λ¦½νΈ - μ€ν 컨ν μ€νΈ