μ€μ½ν(scope)
=μλ³μ(identifier)κ° μ μν λ²μ
= μλ°μ€ν¬λ¦½νΈ μμ§μ΄μλ³μλ₯Ό κ²μν λ μ¬μ©νλ κ·μΉ
λͺ¨λ μλ³μ(λ³μ μ΄λ¦, ν¨μ μ΄λ¦, ν΄λμ€ μ΄λ¦ λ±)
λ μμ μ΄ μ μΈλ μμΉμ μν΄ λ€λ₯Έ μ½λκ° μλ³μ μμ μ μ°Έμ‘°ν μ μλ μ ν¨ λ²μκ° κ²°μ λλ€.
var var1 = 1; // μ½λμ κ°μ₯ λ°κΉ₯ μμμμ μ μΈν λ³μ
if (true) {
var var2 = 2; // μ½λ λΈλ‘ λ΄μμ μ μΈν λ³μ
if (true) {
var var3 = 3; // μ€μ²©λ μ½λ λΈλ‘ λ΄μμ μ μΈν λ³μ
}
}
function foo() {
var var4 = 4; // ν¨μ λ΄μμ μ μΈν λ³μ
function bar() {
var var5 = 5; // μ€μ²©λ ν¨μ λ΄μμ μ μΈν λ³μ
}
}
console.log(var1); // 1
console.log(var2); // 2
console.log(var3); // 3
console.log(var4); // ReferenceError: var4 is not defined
console.log(var5); // ReferenceError: var4 is not defined
μλ³μ κ²°μ (identifier resolution)
= μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ΄λ¦μ΄ κ°μ λ μλ³μ μ€μ μ΄λ€ μλ³μλ₯Ό μ°Έμ‘°ν΄μΌ ν κ²μΈμ§λ₯Ό κ²°μ νλ κ²
- μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μ€νν λ
μ½λμ λ¬Έλ§₯(context)μ κ³ λ €
- μ½λκ° μ΄λμ μ€νλλ©° μ£Όλ³μ μ΄λ€ μ½λκ° μλμ§μ λ°λΌ, λμΌν μ½λλ λ€λ₯Έ κ²°κ³Όλ₯Ό λ§λ λ€.
var x = "global";
function foo() {
var x = "local";
console.log(x); // local
}
foo();
console.log(x); // global
μ€μ½ν
λΌλ κ°λ μ΄ μλ€λ©΄, μμ μ½λ μν©μμλx
λΌλ λ³μκ°μ μ
,foo
ν¨μ λͺ¨λ μ‘΄μ¬ν΄μμΆ©λ
ν κ²μ΄λ€.- μλ³μλ μ΄λ€ κ°μ ꡬλ³ν μ μμ΄μΌ νλ―λ‘
μ μΌ(unique)
ν΄μΌ νλ€. - λ°λΌμ μλ³μμΈ λ³μ μ΄λ¦μ
μ€λ³΅λ μ μλ€.
β νλμ κ°μ μ μΌν μλ³μμ μ°κ²°λμ΄μΌ νλ€.
PCμμ "λμΌν νμΌ μ΄λ¦" μ΄ μ€μ½νλ₯Ό ν΅ν μλ³μ κ²°μ κ°λ₯μ μμ μ€ νλμ΄λ€.
= "λ€λ₯Έ ν΄λ" κ°μ "λμΌν νμΌ μ΄λ¦"μ λ€λ₯Έ νμΌλ‘ μλ³νκ³ μμ± κ°λ₯
λ³μλ
μμ μ΄ μ μΈλ μμΉμ μν΄
μμ μ΄ μ μν λ²μμΈ μ€μ½νκ° κ²°μ λλ€.
κ΅¬λΆ | μ€λͺ | μ€μ½ν | λ³μ |
---|---|---|---|
μ μ | μ½λμ κ°μ₯ λ°κΉ₯ μμ | μ μ μ€μ½ν | μ μ λ³μ |
μ§μ | ν¨μ λͺΈμ²΄ λ΄λΆ | μ§μ μ€μ½ν | μ§μ λ³μ |
- μ μ λ³μ :
μ΄λμλ μ§ μ°Έμ‘° κ°λ₯
- μ§μ λ³μ :
μμ μ μ§μ μ€μ½νμ νμ μ§μ μ€μ½νμμ μ°Έμ‘° κ°λ₯
[ π‘ κ·Έμ μ ]
+ "μ€μ²©ν¨μ(nested function)" = ν¨μ λͺΈμ²΄ λ΄λΆμμ ν¨μκ° μ μλ κ²
+ "μΈλΆν¨μ(outer function)" = μ€μ²© ν¨μλ₯Ό ν¬ν¨νλ ν¨μ
μ€μ½ν체μΈ(scope chain)
= μ€μ½νλ ν¨μμ μ€μ²©μ μν΄κ³μΈ΅μ ꡬ쑰λ₯Ό κ°λλ€.
- λ³μ μ°Έμ‘° μ, μλ°μ€ν¬λ¦½νΈ μμ§μ μ€μ½ν 체μΈμ ν΅ν΄ λ³μλ₯Ό μ°Έμ‘°νλ μ½λμ μ€μ½νμμ μμνμ¬
μμ μ€μ½ν λ°©ν₯μΌλ‘ μ΄λνλ©°
μ μΈλλ³μ(= μλ³μ)λ₯Ό κ²μ(= κ²°μ , identifier resolution)νλ€.
// μ μ ν¨μ
function foo() {
console.log("global function foo");
}
function bar() {
// μ€μ²© ν¨μ
function foo() {
console.log("local function foo");
}
foo(); // local function foo
}
bar();
ν¨μ μ μΈλ¬Έ
μΌλ‘ ν¨μλ₯Ό μ μ βλ°νμ μ΄μ μ ν¨μ κ°μ²΄κ° λ¨Όμ μμ±
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μ μ΄λ¦κ³Ό λμΌν μ΄λ¦μ μλ³μλ₯Ό
μ묡μ μΌλ‘ μ μΈνκ³ μμ±λ ν¨μ κ°μ²΄λ₯Ό ν λΉ
νλ€κ³ νλ€.
- ν¨μλ
μλ³μμ ν λΉλκΈ° λλ¬Έμ
, μ€μ½νλ₯Ό κ°λλ€. - λ°λΌμ μ€μ½νλ₯Ό
"μλ³μλ₯Ό κ²μνλ κ·μΉ"
μ΄λΌκ³ νννλ κ²μ΄ μ ν©ν ννμ΄λΌλ κ²μ΄λ€.
λΈλ‘ λ 벨 μ€μ½ν(block level scope)
- ν¨μ λͺΈμ²΄λ§μ΄ μλλΌ λͺ¨λ μ½λ λΈλ‘(
if, for, while, try - catch λ±
)μ΄ μ§μ μ€μ½νλ₯Ό λ§λ λ€.
- ν¨μ λͺΈμ²΄λ§μ΄ μλλΌ λͺ¨λ μ½λ λΈλ‘(
ν¨μ λ 벨 μ€μ½ν(function level scope)
- μλ°μ€ν¬λ¦½νΈμμ
var ν€μλλ‘ μ μΈλ λ³μ
λμ€λ‘μ§ ν¨μμ μ½λλΈλ‘(ν¨μ λͺΈμ²΄)λ§
μ μ§μ μ€μ½νλ‘ μΈμ νλ€.
- μλ°μ€ν¬λ¦½νΈμμ
var x = 1;
if (true) {
// ifλ¬Έ λΈλ‘ λ΄λΆμμ μ μΈν λ³μ xλ μ§μ μ€μ½νκ° μ μ©λμ§ μλλ€.
// κ·Έλ‘ μΈν΄, λ³μ xλ μ μμ μλ κ²κ³Ό ifλ¬Έ λ΄λΆμ μλ κ²μ νμ¬ μ€λ³΅ μ μΈ λ κ²μ΄λΌ λ³Ό μ μλ€.
var x = 10;
}
console.log(x); // 10
- μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μ
λμ μ€μ½ν(dynamic scope)
ν¨μκ° νΈμΆλλ μμ μ λμ μΌλ‘
μμ μ€μ½νλ₯Ό κ²°μ
μ μ μ€μ½ν(static scope) λλ λ μ컬 μ€μ½ν(lexical scope)
ν¨μλ₯Ό μ΄λμ μ μνλμ§
μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ Javascirpt λ₯Ό λΉλ‘―ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄κ° λ μ컬 μ€μ½νλ₯Ό λ°λ₯Έλ€.