πΈ13μ₯. μ€μ½ν
β
13.1 μ€μ½νλ?
μ€μ½ν(scope) == μλ³μκ° μ ν¨ν λ²μ == μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μλ³μλ₯Ό κ²μν λ μ¬μ©νλ κ·μΉ
λͺ¨λ μλ³μ(λ³μ μ΄λ¦, ν¨μ μ΄λ¦, ν΄λμ€ μ΄λ¦ λ±)
λ μμ μ΄ μ μΈλ μμΉμ μν΄ λ€λ₯Έ μ½λκ° μλ³μ μμ μ μ°Έμ‘°ν μ μλ μ ν¨ λ²μκ° κ²°μ λλ€.
μλ³μ κ²°μ (identifier resolution)
μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ΄λ€ λ³μλ₯Ό μ°Έμ‘°ν΄μΌν μ§ κ²°μ νλ κ²
var x = "global";
function foo() {
var x = "local";
console.log(x); // (1) local
}
foo();
console.log(x); // (2) global
μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μ€νν λ
μ½λμ λ¬Έλ§₯(context)
μ κ³ λ €νλ€.μ½λκ° μ΄λμμ μ€νλκ³ μ£Όλ³μ μ΄λ€ μ½λκ° μλμ§(λ μ컬 νκ²½)μ λ°λΌ λμΌν μ½λ(1κ³Ό 2)λ λ€λ₯Έ κ²°κ³Όλ₯Ό λ§λ λ€.
μ€μ½νλ λ€μμ€νμ΄μ€λ€.
μ€μ½ν λ΄μμ μλ³μλ μ μΌν΄μΌνμ§λ§, λ€λ₯Έ μ€μ½νμλ κ°μ μ΄λ¦μ μλ³μλ₯Ό μ¬μ©ν μ μλ€.
μλ³μλ μ΄λ€ κ°μ ꡬλ³ν μ μμ΄μΌνλ―λ‘
μ μΌ
ν΄μΌνλ€. β μλ³μμΈ λ³μ μ΄λ¦μ μ€λ³΅λ μ μλ€. β νλμ κ°μ μ μΌν μλ³μμ μ°κ²°(name binding)λμ΄μΌ νλ€.
β
13.2 μ€μ½νμ μ’
λ₯
λ³μλ μμ μ΄ μ μΈλ μμΉ(μ μ/μ§μ)μ μν΄ μμ μ΄ μ ν¨ν λ²μμΈ μ€μ½νκ° κ²°μ λλ€.
μ μ
μ½λμ κ°μ₯ λ°κΉ₯ μμ
μ μ μ€μ½ν
μ μ λ³μ
μ§μ
ν¨μ λͺΈμ²΄ λ΄λΆ
μ§μ μ€μ½ν
μ§μ λ³μ
μ μλ³μλ μ΄λμλ μ§ μ°Έμ‘°ν μ μλ€.
μ§μλ³μλ μμ μ μ§μ μ€μ½νμ νμ μ§μ μ€μ½νμμ μ°Έμ‘°ν μ μλ€.
β
13.3 μ€μ½ν 체μΈ
μ€μ½ν μ²΄μΈ == μ€μ½νλ ν¨μμ μ€μ²©μ μν΄Β κ³μΈ΅μ ꡬ쑰λ₯Ό κ°λλ€.
λ³μλ₯Ό μ°Έμ‘°ν λ μλ°μ€ν¬λ¦½νΈ μμ§μ μ€μ½ν 체μΈμ ν΅ν΄ λ³μλ₯Ό μ°Έμ‘°νλ μ½λμ μ€μ½νμμ μμνμ¬ μμ μ€μ½ν λ°©ν₯μΌλ‘ μ΄λνλ©°
μ μΈλ λ³μλ₯Ό κ²μ(identifier resoluton)
νλ€.
μ§μ : outer ν¨μ & innter ν¨μ
innerν¨μλ outer ν¨μμ μ€μ²©ν¨μ
outer ν¨μκ° λ§λ μ§μ μ€μ½νλ inner ν¨μκ° λ§λ μ§μ μ€μ½νμ μμμ€μ½νμ΄κ³
outer ν¨μμ μ§μ μ€μ½νμ μμμ€μ½νλ μ μ μ€μ½νλ€.
@μΈλΆ ν¨μ(outer function)
: μ€μ²© ν¨μλ₯Ό ν¬ν¨νλ ν¨μ
@μ€μ²© ν¨μ(nested function)
: ν¨μ λͺΈμ²΄ λ΄λΆμμ ν¨μκ° μ μλ κ²
μ€μ½ν 체μΈμ μν λ³μ κ²μ
μμ μ€μ½νμμ μ ν¨ν λ³μλ νμ μ€μ½νμμ μμ λ‘κ² μ°Έμ‘°ν μ μμ§λ§ νμ μ€μ½νμμ μ ν¨ν λ³μλ₯Ό μμ μ€μ½νμμ μ°Έμ‘°ν μ μλ€.
var x = "global x";
var y = "global y";
function outer() {
var z = "outer's local z";
function inner() {
var x = "inner's local x";
console.log(x); // (4) inner's local x
console.log(y); // (5) global y
}
inner();
}
outer();
λ³μλ₯Ό μ°Έμ‘°νλ μ€μ½νμμ κ²μ β μ‘΄μ¬νμ§ μμΌλ©΄ μμμ€μ½νλ‘ μ΄λ ν κ²μ
(4) x λ³μλ₯Ό μ°Έμ‘°νλ μ€μ½νμΈ inner ν¨μμ μ§μ μ€μ½νμμ x λ³μ κ²μ β μ‘΄μ¬ O : κ²μλ λ³μ μ°Έμ‘° ν μ’ λ£
(5) y λ³μλ₯Ό μ°Έμ‘°νλ μ€μ½νμΈ inner ν¨μμ μ§μ μ€μ½νμμ y λ³μ κ²μ β μ‘΄μ¬ X β μμ μ€μ½νμΈ outer ν¨μμ μ§μ μ€μ½νλ‘ μ΄λ β outerμλ μ‘΄μ¬ X β μμ μ€μ½νμΈ μ μ μ€μ½νλ‘ μ΄λ β μ‘΄μ¬ O : κ²μλ λ³μ μ°Έμ‘° ν μ’ λ£
μ€μ½ν 체μΈμ μν ν¨μ κ²μ
// μ μ ν¨μ
function foo() {
console.log("global function foo");
}
function bar() {
// μ€μ²© ν¨μ
function foo() {
console.log("local function foo");
}
foo(); // (1)
}
bar();
// μΆλ ₯λ κ° : local function foo
ν¨μ μ μΈλ¬ΈμΌλ‘ ν¨μλ₯Ό μ μνλ©΄, λ°νμ μ΄μ μ ν¨μ κ°μ²΄κ° λ¨Όμ μμ±λλ€. κ·Έλ¦¬κ³ μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μ μ΄λ¦κ³Ό λμΌν μ΄λ¦μ μλ³μλ₯Ό μ묡μ μΌλ‘ μ μΈνκ³ μμ±λ ν¨μ κ°μ²΄λ₯Ό ν λΉνλ€. [12μ₯ ν¨μ μ°Έκ³ ]
λ°λΌμ, μ μ½λμμ (1)μμ foo ν¨μλ₯Ό νΈμΆνλ©΄
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μλ₯Ό νΈμΆνκΈ° μν΄ ν¨μλ₯Ό κ°λ¦¬ν€λ μλ³μ fooλ₯Ό κ²μνλ€.
β
13.4 ν¨μ λ 벨 μ€μ½ν
λΈλ‘ λ 벨 μ€μ½ν(block level scope)
ν¨μ λͺΈμ²΄λ§μ΄ μλλΌ
λͺ¨λ μ½λ λΈλ‘
(if, for, while, try/catch λ±)μ΄ μ§μ μ€μ½νμ λ§λ λ€.
ν¨μ λ 벨 μ€μ½ν(function level scope)
var ν€μλλ‘ μ μΈλ λ³μ
λ μ€λ‘μ§ν¨μμ μ½λ λΈλ‘
(ν¨μ λͺΈμ²΄)λ§μ μ§μμ€μ½νλ‘ μΈμ νλ€.λ°λΌμ, ν¨μ λ°μμ var ν€μλλ‘ μ μΈλ λ³μλ μ½λ λΈλ‘ λ΄μμ μ μΈλμλ€ ν μ§λΌλ λͺ¨λ μ μ λ³μλ€.
var x = 1; // μ μ
if (true) {
var x = 10; // μ€λ³΅ μ μΈ
}
console.log(x); // 10
β
13.5 λ μ컬 μ€μ½ν
μλ°μ€ν¬λ¦½νΈλ λ μ컬 μ€μ½νλ₯Ό λ°λ₯Έλ€.
ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μ
ν¨μλ₯Ό μ΄λμ νΈμΆ
νλ μ§μ λ°λΌ κ²°μ β λμ μ€μ½ν(dynamic scope)ν¨μλ₯Ό μ΄λμ μ μ
νλ μ§μ λ°λΌ κ²°μ β μ μ μ€μ½ν(static scope) / λ μ컬 μ€μ½ν(lexical scope)
μλ°μ€ν¬λ¦½νΈλ λ μ컬 μ€μ½νλ₯Ό λ°λ₯Έλ€.
λ°λΌμ, ν¨μκ° νΈμΆλ μμΉλ μμ μ€μ½ν κ²°μ μ μ΄λ ν μν₯λ μ£Όμ§ μλλ€.
ν¨μμ μμ μ€μ½νλ μΈμ λ μμ μ μ μλ μ€μ½νλ€.
ν¨μμ μμμ€μ½νλ ν¨μ μ μκ° μ€νλ λ μ μ μΌλ‘ κ²°μ λλ€.
Last updated