μ΄λ² κΈμμλ λ μ컬 μ€μ½νκ° λ¬΄μμ΄κ³ ,
μλ°μ€ν¬λ¦½νΈμμ μ΄λ»κ² λμνλμ§ μ 리ν΄λ³΄λ €κ³ νλ€.
π§ μ€μ½νλ 무μμΌκΉ?
μ€μ½ν(Scope)λ λ³μλ ν¨μμ μ κ·Όν μ μλ μ ν¨ λ²μλ₯Ό μλ―Ένλ€.
μλ°μ€ν¬λ¦½νΈμ λͺ¨λ λ³μλ μμ λ§μ μ ν¨ λ²μλ₯Ό κ°μ§λ©°,
μ΄ λ²μλ₯Ό κ²°μ νλ κ·μΉμ΄ λ°λ‘ λ μ컬 μ€μ½νμ΄λ€.
μ€μ½νλ ν¬κ² λ κ°μ§λ‘ λλ μ μλ€.
- μ μ μ€μ½ν (Global Scope): μ½λ μ΄λμμλ μ κ·Όν μ μλ κ°μ₯ λ°κΉ₯ λ²μ
- μ§μ μ€μ½ν (Local Scope): ν¨μλ λΈλ‘(
{ }
) λ΄λΆμ μ μΈλμ΄ κ·Έ μμμλ§ μ ν¨ν λ²μ- ν¨μ μ€μ½ν (Function Scope): ν¨μ λ΄μμλ§ μ ν¨ (
var
) - λΈλ‘ μ€μ½ν (Block Scope):
{ }
λΈλ‘ λ΄μμλ§ μ ν¨ (let
,const
)
- ν¨μ μ€μ½ν (Function Scope): ν¨μ λ΄μμλ§ μ ν¨ (
const globalName = 'Alice'; // μ μ μ€μ½ν
function sayHello() {
const localName = 'Bob'; // μ§μ μ€μ½ν (ν¨μ μ€μ½ν)
console.log(`Hello, ${globalName}`); // β
μ μ λ³μ μ κ·Ό κ°λ₯
console.log(`Hello, ${localName}`); // β
μ§μ λ³μ μ κ·Ό κ°λ₯
}
sayHello();
// ν¨μ μ€μ½ν λ°μμλ μ§μ λ³μμ μ κ·Όν μ μμ
console.log(localName); // ReferenceError: localName is not defined
π‘ μ£Όμ: var
λ λΈλ‘ μ€μ½νλ₯Ό 무μνλ€.
→ λΈλ‘(if
, for
) μμμ μ μΈν΄λ λ°κΉ₯μμ μ κ·Ό κ°λ₯
var ν€μλμ κ΄λ ¨λ λ΄μ©μ ν΄λΉ κΈμ μ°Έκ³
if (true) {
var x = 10; // ν¨μ μ€μ½ν
let y = 20; // λΈλ‘ μ€μ½ν
}
console.log(x); // 10
console.log(y); // ReferenceError
πΊοΈ λ μ컬 μ€μ½νλ?
λ μ컬 μ€μ½ν(Lexical Scope)λ
μ½λκ° μμ±λ μμΉ(μ μλ μμΉ)μ λ°λΌ μ€μ½νκ° κ²°μ λλ κ·μΉμ μλ―Ένλ€.
λ μ컬 μ€μ½νλ μ½λκ° μ€νλκΈ° μ , μ½λλ₯Ό μμ±νκ³ λΆμνλ λ¨κ³μμ
μ΄λ―Έ μ μ μΌλ‘(Static) κ²°μ λκΈ° λλ¬Έμ μ μ μ€μ½ν(Static Scope)λΌκ³ λΆλ¦¬κΈ°λ νλ€.
λ€μ λ§ν΄μ μ½λκ° μ΄λμ νΈμΆλλμ§κ° μλλΌ
μ΄λμ μ μλμλμ§κ° μ€μνλ€λΌλ μλ―Έμ΄λ€.
π λ μ컬 μ€μ½ν μμ
- ν¨μ = μ§: κ°κ°μ ν¨μλ λ 립λ μ§
- λ΄λΆ μ€μ½ν = μ°λ¦¬ μ§ μ: μ°λ¦¬ μ§μμλ μ§ μμ 물건(λ΄λΆ λ³μ)μ λ§μλλ‘ λ³΄κ±°λ μΈ μ μμ
- μΈλΆ μ€μ½ν = μ°λ¦¬ λλ€: μ°λ¦¬ μ§ λ°μΌλ‘ λκ°λ©΄ μ°λ¦¬ λλ€(μΈλΆ μ€μ½ν)μ μλ κ°κ², 곡μ(μΈλΆ λ³μ)λ₯Ό 보거λ μ΄μ©ν μ μμ
- κ·μΉ: λλ λ€λ₯Έ μ¬λ μ§ μ(λ΄λΆ μ€μ½ν)μ λ§μλλ‘ λ³Ό μ μμ
const neighborhood = 'μ°λ¦¬ λλ€'; // μΈλΆ μ€μ½ν
function myHouse() {
const myRoom = 'λ΄ λ°©'; // λ΄λΆ μ€μ½ν
function lookAround() {
const desk = 'λ΄ μ±
μ';
console.log(desk); // 'λ΄ μ±
μ' (μκΈ° μμ μ λ³μ)
console.log(myRoom); // 'λ΄ λ°©' (μΈλΆ ν¨μ λ³μ)
console.log(neighborhood); // 'μ°λ¦¬ λλ€' (μ μ λ³μ)
}
lookAround();
}
myHouse();
// λ°μμλ μ§ μμ λ§μλλ‘ λ³Ό μ μμ
console.log(myRoom); // ReferenceError: myRoom is not defined
ποΈ λ μ컬 μ€μ½ν vs λ μ컬 νκ²½
λ μ컬 μ€μ½νμ λ μ컬 νκ²½μ΄ κ°μ κ°λ μ΄λΌκ³ μ€ν΄νκΈ° μ¬μ΄λ°
λμ ꡬλΆνλ©΄ μ΄ν΄κ° ν¨μ¬ μ¬μμ§λ€.
- μ€μ½ν (Scope)
λ³μμ μ ν¨ λ²μμ λν μΆμμ μΈ κ·μΉμ΄μ μμΉ - λ μ컬 νκ²½ (Lexical Environment)
μ€μ½νλΌλ κ·μΉμ μ€μ λ‘ κ΅¬ννκΈ° μν΄ μμ§μ΄ μ¬μ©νλ ꡬ체μ μΈ κ°μ²΄
μ¦, μλ°μ€ν¬λ¦½νΈ μμ§μ μ€μ½ν κ·μΉμ μ§ν€κΈ° μν΄μ λ μ컬 νκ²½μ΄λΌλ λꡬλ₯Ό μ¬μ©νλ€.
λ μ컬 νκ²½ κ°μ²΄λ λ κ°μ§ μ£Όμ μμλ‘ κ΅¬μ±λλ€.
- νκ²½ λ μ½λ (Environment Record)
νμ¬ μ€μ½νμ μν λ³μμ ν¨μ μλ³μλ₯Ό κΈ°λ‘νλ λ΄λΆ ꡬ쑰 - μΈλΆ λ μ컬 νκ²½ μ°Έμ‘° (Outer Lexical Environment Reference)
λ°κΉ₯ μ€μ½ν(λΆλͺ¨ λ μ컬 νκ²½)λ₯Ό κ°λ¦¬ν€λ μ°Έμ‘°
→ μ΄ μ°Έμ‘°κ° μ€μ½ν 체μΈ(Scope Chain)μ νμ±ν¨
π΅οΈβοΈ μμ§μ λ³μλ₯Ό μ΄λ»κ² μ°ΎμκΉ?
μλ°μ€ν¬λ¦½νΈ μμ§μ΄ λ³μλ₯Ό μ°Ύλ κ³Όμ μ μ€μ½ν 체μΈμ ν΅ν΄ μ΄λ£¨μ΄μ§λ€.
π λ³μ μ°Έμ‘° κ³Όμ
- νμ¬ μ€ν μ€μΈ μ½λμ λ μ컬 νκ²½μμ λ³μλ₯Ό μ°Ύλλ€. (νκ²½ λ μ½λ νμ)
- λ§μ½ μμΌλ©΄, μΈλΆ λ μ컬 νκ²½ μ°Έμ‘°λ₯Ό λ°λΌ μμ μ€μ½νλ‘ μ΄λνλ€.
- μμ μ€μ½νμ λ μ컬 νκ²½μμ λ€μ λ³μλ₯Ό μ°Ύλλ€.
- μ΄ κ³Όμ μ κ³μ λ°λ³΅νλ€κ° μ μ μ€μ½νκΉμ§ λλ¬νλ€.
- μ μ μ€μ½νμμλ λ³μλ₯Ό μ°Ύμ§ λͺ»νλ©΄
ReferenceError
λ₯Ό λ°μμν¨λ€.
μ μ½λμμ innerFunc
κ° globalVar
λ₯Ό μ°Ύλ κ³Όμ μ μ€μ½ν 체μΈμ λͺ
ννκ² λ³΄μ¬μ€λ€.
μ΄μ²λΌ λ΄λΆ μ€μ½νμμ μμν΄ μΈλΆ μ€μ½νλ‘ ν λ¨κ³μ© μ¬λΌκ°λ©° λ³μλ₯Ό μ°Ύλ κ³Όμ μ
μ€μ½ν 체μ΄λ(Scope Chaining)μ΄λΌκ³ νλ€.
π λ μ컬 μ€μ½νμ thisμ μ°¨μ΄
- λ μ컬 μ€μ½ν: μ μλ μμΉλ₯Ό κΈ°μ€μΌλ‘ λ³μκ° κ²°μ λ¨
- this: νΈμΆλ λ°©μμ λ°λΌ λμ μΌλ‘ κ²°μ λ¨
const obj = {
name: 'Alice',
printName: function() {
console.log(this.name); // νΈμΆν κ°μ²΄μ λ°λΌ λ¬λΌμ§
}
};
function outer() {
const text = 'Hello';
function inner() {
console.log(text); // μ μλ μμΉ κΈ°μ€ (λ μ컬 μ€μ½ν)
}
inner();
}
κ΅¬λΆ | λ μ컬 μ€μ½ν | this |
---|---|---|
κ²°μ μμ | μ½λ μμ±(μ μ) μμΉ | ν¨μ νΈμΆ λ°©μ |
νΉμ§ | μ μ (λ³νμ§ μμ) | λμ (νΈμΆ λ§₯λ½μ λ°λΌ λ¬λΌμ§) |
μμ | μΈλΆ λ³μ μ°Έμ‘° | κ°μ²΄ λ©μλ νΈμΆ μ κ°μ²΄ μ°Έμ‘° |
β¨ μ 리
- λ μ컬 μ€μ½ν: μ½λκ° μμ±λ μμΉμ λ°λΌ λ³μμ μ ν¨ λ²μκ° κ²°μ λλ μ μ κ·μΉ
- λ μ컬 νκ²½: μμ§μ΄ μ΄ κ·μΉμ μ§ν€κΈ° μν΄ λ΄λΆμ μΌλ‘ κ΄λ¦¬νλ κ°μ²΄
- μμ§μ μ€μ½ν 체μΈμ λ°λΌ λ³μλ₯Ό κ²μ
this
λ νΈμΆ λ°©μμ λ°λΌ κ²°μ λκ³ , λ μ컬 μ€μ½νλ μ μλ μμΉλ‘ κ²°μ
π μ°Έκ³
λ³μμ μ ν¨λ²μμ ν΄λ‘μ
ko.javascript.info