# μ€μ½ν(Scope)
μ€μ½νλ λ³μμ μ ν¨ λ²μλ₯Ό μλ―Έν©λλ€.
# κΈλ‘λ² μ€μ½ν
λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μλ λ€λ₯΄κ² μλ°μ€ν¬λ¦½νΈμ λ³μλ μ ν¨ λ²μκ° μ μμΌλ‘ μμν©λλ€. μλ₯Ό λ€μ΄ μλμ κ°μ λ³μ μ μΈμ μλ°μ€ν¬λ¦½νΈλ‘ μ κ·Όν μ μλ λͺ¨λ μμμμ κ°μ κ°μ κ°μ΅λλ€.
var a = 10;
λ§μ½ ν¨μλ₯Ό λ§λ€μ΄ μλμ κ°μ΄ μ κ·ΌνλλΌλ λμΌν κ°μ μΆλ ₯νκ² λ©λλ€.
var a = 10;
function getA() {
console.log(a);
}
getA(); // 10
# λ‘컬 μ€μ½ν
κΈ°λ³Έμ μΌλ‘ λ³μμ μ ν¨ λ²μλ μ μ λ²μλ₯Ό κ°λλ€κ³ νμ§λ§, ν¨μ μμμ μλ‘ μ μΈνλ κ²½μ° ν¨μ λ¨μμ μ§μ λ²μμΈ ν¨μ μ€μ½νλ₯Ό κ°μ΅λλ€. μλ μ½λλ₯Ό λ³΄κ² μ΅λλ€.
var a = 10;
function getA() {
var a = 20;
console.log(a);
}
getA(); // 20
console.log(a); // 10
μ μ½λλ ν¨μ λ°κΉ₯μμ λ³μ a
λ₯Ό μ μΈνκ³ 10μ λμ
ν λ€, getA()
λΌλ ν¨μλ₯Ό μ μΈνλ©΄μ ν¨μ μμ λ³μ a
λ₯Ό μλ‘ μ μΈνκ³ 20μ λμ
ν μ½λμ
λλ€. getA()
ν¨μλ₯Ό μ€ννλ©΄ ν¨μ μμ λ³μμΈ a
κ° 20μ κ°μΌλ‘ μ½μμ μΆλ ₯λ©λλ€. ν¨μμ μ€νμ΄ λλκ³ λμ console.log(a);
λ‘ λ€μ a
μ κ°μ μΆλ ₯νλ©΄ 10μ΄ μΆλ ₯λ©λλ€.
μ¬κΈ°μ λ³μμ μ ν¨ λ²μλ ν¨μ λ¨μλ‘ νμ λλ€λ κ²μ μ μ μμ΅λλ€.
# μ€μ½ν 체μΈ
λ³μλ₯Ό μ°Ύμ λ λ¨Όμ μμ μ΄ μν μ€μ½νμμ μ°Ύκ³ μμΌλ©΄ μμ μ€μ½νμμ μ°Ύλ νμμ μ€μ½ν 체μΈ(Scope Chain)μ΄λΌκ³ ν©λλ€.
κ°λ¨ν μμ λ‘ μμ μ½λλ₯Ό λ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
// κΈλ‘λ² μ€μ½ν
var a = 10;
function getA() {
// λ‘컬 μ€μ½ν
console.log(a);
}
getA(); // 10
getA()
ν¨μκ° μ€νμ΄ λλ©΄ λ¨Όμ μ§μ λ²μμΈ getA()
ν¨μ μμμ λ³μ a
λ₯Ό μ°Ύκ³ getA()
ν¨μμλ λ³μ a
κ° μκΈ° λλ¬Έμ μμ μ€μ½νμΈ μ μ λ²μμμ λ³μ a
λ₯Ό λ€μ μ°Ύμ΅λλ€.
λ€μ μμ λ₯Ό λ³΄κ² μ΅λλ€.
// κΈλ‘λ² μ€μ½ν
var a = 10;
function outer() {
// μΈλΆ ν¨μ μ€μ½ν
var b = 20;
function inner() {
// λ‘컬 ν¨μ μ€μ½ν
var c = 30;
console.log(a);
console.log(b);
console.log(c);
}
inner();
};
outer();
// κ²°κ³Ό
// 10
// 20
// 30
μμ μ½λλ inner()
ν¨μμμ a, b, c
λ³μλ₯Ό μ°Έμ‘°ν λ μ€μ½ν 체μΈμ μν΄μ inner()
λ‘컬 ν¨μ μ€μ½ν, outer()
μΈλΆ ν¨μ μ€μ½ν, κΈλ‘λ² μ€μ½νμ μμλ‘ λ³μλ₯Ό μ°Ύμ΅λλ€.
# λ μ컬 μ€μ½ν
μμμ μμ μ μ€μ½νμμ λ³μλ₯Ό μ°Ύκ³ μμΌλ©΄ μμ μ€μ½νμμ μ°Ύλ μ€μ½ν 체μΈμ λν΄ μμ보μμ΅λλ€. κ·Έλ λ€λ©΄ μ΄ μμ μ€μ½νλ μ΄λ€ κΈ°μ€μΌλ‘ μ νκ² λλ κ²μΌκΉμ?
μλ°μ€ν¬λ¦½νΈλ ν¨μλ₯Ό μ΄λμ μ μΈνμλμ§μ λ°λΌμ μμ μ€μ½νλ₯Ό κ²°μ νλ λ μ컬 μ€μ½ν(Lexical Scope) κ·μΉμ λ°λ¦ λλ€.
// κΈλ‘λ² μ€μ½ν
var a = 10;
var b = 20;
function getA() {
var b = a;
getB();
}
function getB() {
// λ‘컬 ν¨μ μ€μ½ν
console.log(b);
}
getB(); // 20
getA(); // 20
μ μ½λμμ getB()
ν¨μλ μ μ λ²μμ μ μΈλμκΈ° λλ¬Έμ νΈμΆλ μμΉμ μκ΄μμ΄ μμ μ€μ½νλ‘ κ°λ κΈλ‘λ² μ€μ½νμ μκΈ° μμ μΈ λ‘컬 ν¨μ μ€μ½νλ₯Ό μ΅μ’
μ€μ½νλ₯Ό κ°κ² λμ λ λ€ 20μ μΆλ ₯ν©λλ€.
μ΄μ λ°λλλ κ°λ μΈ λ€μ΄λλ―Ή μ€μ½ν(Dynamic Scope) κ·μΉμ λ°λ₯΄λ μΈμ΄λ ν¨μμ νΈμΆ μμΉμ λ°λΌ μμ μ€μ½νκ° κ²°μ λ©λλ€.
#!/bin/sh
A=10
B=20
getA(){
B=$A
getB
}
getB(){
echo $B
}
getB # 20
getA # 10
λ€μ΄λλ―Ή μ€μ½ν κ·μΉμ λ°λ₯΄λ μ μ€ν¬λ¦½νΈλ 20, 10μ΄ μΆλ ₯ λ©λλ€.