μλ°μ€ν¬λ¦½νΈλ μ μ΄λ κ² λ€λ₯Έ μΈμ΄λ€κ³Ό λ€λ₯΄κ² μλν κΉμ? κ·Έ μμΈ μ€ νλλ₯Ό μμΈν μ΄ν΄λ΄ λλ€!
μλ³μκ° μ ν¨ν λ²μλ₯Ό λ§νλ©°, μ¬λ¬ κ·μΉμ λ°λΌ λμν©λλ€.
μ€μ½νλ λ³μ, ν¨μμ μμ£Ό κΉμ κ΄λ ¨μ΄ μμ£ . μ°λ¦¬κ° 보μλ ν¨μ 맀κ°λ³μλ λ΄λΆμμ μ ν¨νλ μΈλΆμμλ μ ν¨νμ§ λͺ»ν©λλ€. μ΄κ²μ΄ λ°λ‘ 맀κ°λ³μκ° μ°Έμ‘°ν μ μλ μ ν¨λ²μμΈ μ€μ½νκ° ν¨μ λͺΈμ²΄ λ΄λΆλ‘ νμ λκΈ° λλ¬Έμ λλ€.
λͺ¨λ μλ³μ(λ³μ, ν¨μ, ν΄λμ€ λ±)λ μμ μ΄ μ μΈλ μμΉμ λ€λ₯Έ μ½λκ° μμ μ μ°Έμ‘°ν μ μλμ§μ λν μ ν¨ λ²μκ° κ²°μ λ©λλ€. μ΄λ₯Ό μ€μ½νλΌκ³ ν©λλ€.
μμ λ₯Ό νλ λ³ΌκΉμ? μ, κ·Έλ¦¬κ³ μ΄λ² μ₯μμλ var
ν€μλλ₯Ό μμ£Ό μ¬μ©ν©λλ€. μ΄λ let, const
κ° κ°μ§λ μ€μ½νμ λ€λ₯΄κΈ° λλ¬Έμ΄λ μ°Έκ³ ν΄μ£ΌμΈμ!
var a = 1;
function foo(){
var a = 10;
console.log(x); // ?
}
foo();
console.log(a); // ?
μ μ λ³μλ‘μμ aμ, μ§μ λ³μλ‘μμ aκ° μ‘΄μ¬ν©λλ€. μ΄ λ μλ°μ€ν¬λ¦½νΈ μμ§μ μ€μ½νλ₯Ό ν΅ν΄ μ΄λ€ λ³μλ₯Ό μ°Έμ‘°ν μ§ κ²°μ νλ μλ³μ κ²°μ (Identifier Resolution) μ΄ μΌμ΄λ©λλ€. κ²°κ΅ μ€μ½νλ μλ³μλ₯Ό κ²μν λ μ¬μ©νλ κ·μΉμ΄λΌκ³ λ ν μ μλ κ±°μ£ .
μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μ€νν λ μ½λμ λ¬Έλ§₯(context)μ κ³ λ €ν©λλ€.
μ½λκ° μ΄λμ μ€νλλ©°, μ£Όλ³μ μ΄λ€ μ½λκ° μλμ§λ₯Ό λ μ컬 νκ²½(Lexical Environment)λΌκ³ ν©λλ€. μ΄λ° μ½λ λ¬Έλ§₯μ λ μ컬 νκ²½μΌλ‘ μ΄λ£¨μ΄μ§λ©°, μ΄λ₯Ό ꡬνν κ²μ΄ μ€ν 컨ν μ€νΈ(Execution Context) μ λλ€. λͺ¨λ μ½λλ μ€ν 컨ν μ€νΈμμ νκ°λκ³ μ€νλλ©°, μ€μ½νλ μ€ν 컨ν μ€νΈμ κΉμ μ°κ΄μ΄ μμΌλ μ°¨ν μμΈν λ€λ£Ήλλ€.
μ μμ μ½λμ 맨 μμ μ μΈλ λ³μ a
λ μ΄λμλ μ°Έμ‘°ν μ μμ§λ§ foo ν¨μ λ΄λΆμ μ μΈλ λ³μ a
λ foo ν¨μ μΈλΆμμ μ°Έμ‘°ν μ μμ΅λλ€. μ¦, μλ³μκ° λμΌν΄λ μ ν¨ν λ²μμΈ μ€μ½νκ° λ€λ₯΄λ―λ‘ λ³κ°μ λ³μκ° λλ μ
μ΄μ£ .
μ°λ¦¬λ λ³μλ₯Ό λ°°μ°λ©΄μ μλ³μλ μ μΌν κ°μ΄λΌκ³ μ΄ν΄νμ΅λλ€. μ€μ½νκ° μ‘΄μ¬νμ§ μμΌλ©΄ λμΌν μλ³μλ μΆ©λμ μΌμΌν€λ―λ‘ νλ λ°μ μ¬μ©ν μ μκ² λκ² μ£ . μ΄μ²λΌ νλ‘κ·Έλλ° μΈμ΄λ μ€μ½ν(μ ν¨ λ²μ)λ₯Ό ν΅ν΄ λ³μ μ΄λ¦κ³Ό μΆ©λμ λ°©μ§ν©λλ€.
μ 리νμλ©΄ μ€μ½ν λ΄μμμ μλ³μλ μ μΌν΄μΌ νμ§λ§, λ€λ₯Έ μ€μ½νλ κ°μ μλ³μλ₯Ό μ¬μ©ν μ μμΌλ―λ‘ λ€μ μ€νμ΄μ€(κ°μ²΄λ₯Ό ꡬλΆν μ μλ λ²μ) λΌκ³ ν μ μμ΅λλ€.
μ°Έκ³ :
var
ν€μλλ‘ μ μΈν λ³μ μ€λ³΅ μ μΈ
var
ν€μλλ‘ μ μΈλ λ³μλ κ°μ μ€μ½νλΌλ μ€λ³΅μ΄ νμ©λ©λλ€.
function foo(){
var a = 1;
var a = 10;
// μλ°μ€ν¬λ¦½νΈ μμ§μ var ν€μλλ₯Ό μλ΅νκ³ a = 10; μ΄λΌκ³ νκ° ν©λλ€.
console.log(a); // 10
}
let
,const
ν€μλλ‘ μ μΈλ λ³μλ κ°μ μ€μ½ν λ΄μμ μ€λ³΅μ΄ νμ©λμ§ μμ΅λλ€.
function bar(){
let a = 1;
let a = 10; // SyntaxError: Identifier 'a' has already been declared
}
νλ‘κ·Έλλ° μ½λλ μ μ(Global)κ³Ό μ§μ(Local)μΌλ‘ λλ©λλ€.
μ°λ¦¬λ μ΄λ―Έ μ μ, μ§μμ λν΄ μκ³ μμ΅λλ€. νλ‘ λ³ΌκΉμ?
κ΅¬λΆ | μ€λͺ | μ€μ½ν | λ³μ |
---|---|---|---|
μ μ | μ½λμ κ°μ₯ λ°κΉ₯ μμ | μ μ μ€μ½ν (Global Scope) |
μ μ λ³μ (Global Variable) |
μ§μ | ν¨μ λ΄λΆ | μ§μ μ€μ½ν (Local Scope or Function-level Scope) |
μ§μ λ³μ (Local Variable) |
-
μ μ μ€μ½ν(Global Scope) : μ΄λ€ λΈλ‘μΌλ‘λ κ°μΈμ Έ μμ§ μμ κ²½μ°, μ μ μ€μ½ν μμ μ‘΄μ¬ν©λλ€.
- μ μ΄λ¬Έ, ν¨μλ μ€κ΄νΈ(
{}
)λ‘ νκΈ°ν©λλ€. μ¦ μ€κ΄νΈ λ°μ μλ λͺ¨λ λ³μλ μ μ λ³μλ‘μ μ‘΄μ¬νκ² λ©λλ€. μ¦, μ΄λμλΌλ μ°Έμ‘°ν μ μμ΅λλ€.
- μ μ΄λ¬Έ, ν¨μλ μ€κ΄νΈ(
-
μ§μ μ€μ½ν(Local Scope) : μ΄λ€ λΈλ‘μΌλ‘ κ°μΈμ Έ μλ κ²½μ°, μ§μ μ€μ½ν μμ μ‘΄μ¬ν©λλ€.
- μ€κ΄νΈ μμ μλ λͺ¨λ λ³μλ μ§μ λ³μλ‘μ μ‘΄μ¬νκ³ , μμ μ μ§μ μ€μ½νμ νμ μ§μ μ€μ½νμ νν΄ μ ν¨ν©λλ€.
- μμ κ·Έλ¦Όμμ, inner() ν¨μ λ΄λΆμ μ§μ λ³μ
a
μ κ°μ μ΄λ¦μ μ μ λ³μκ° μ‘΄μ¬ν©λλ€. μ΄λ inner() ν¨μ λ΄λΆμμ μ°Έμ‘°νλ λ³μa
λ μ μ λ³μκ° μλ μ§μ λ³μa
μ λλ€. λ°λ‘ μ€μ½ν 체μΈ(Scope Chain)μ ν΅ν΄ μ°Έμ‘°ν λ³μλ₯Ό κ²μνλ μλ³μ κ²°μ (Identifier Resolution) κ³Όμ μ κ±°μ³€κΈ° λλ¬Έμ΄μμ!
μ€μ½νλ ν¨μμ μ€μ²©μ μν΄ κ³μΈ΅μ μΌλ‘ ꡬ쑰λ₯Ό κ°μ§λ©°, μ΄λ κ² μ°κ²°λ κ²μ μ€μ½ν 체μΈμ΄λΌκ³ ν©λλ€.
λ³μλ₯Ό μ°Έμ‘°ν λ μλ°μ€ν¬λ¦½νΈ μμ§μ μ€μ½ν 체μΈμ ν΅ν΄ λ³μλ₯Ό μ°Έμ‘°νλ μ½λμ μ€μ½νμμ μμνκ³ , μμ μ€μ½ν λ°©ν₯μΌλ‘ μ΄λνλ©° μ μΈλ λ³μλ₯Ό κ²μνμ¬ κ²°μ (Identifier Resolution)ν©λλ€. κ·Έλ κΈ°μ μμ μ€μ½νμμ μ μΈν λ³μλ₯Ό νμ μ€μ½νμμλ μ°Έμ‘°ν μ μμ£ .
μ€μ½ν 체μΈμ 물리μ μΈ μ€μ²΄λ‘ μ‘΄μ¬ν©λλ€! μλ°μ€ν¬λ¦½νΈ μμ§μ μ μλ£κ΅¬μ‘°μ μ μ¬ν λ μ컬 νκ²½(Lexical Environment)λ₯Ό μ€μ λ‘ μμ±ν©λλ€. μμλ μλμ κ°μμ.
κ·Έ μ μ! λ μ컬 νκ²½λ λκΉμ? μ€μ½ν 체μΈμ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½λ₯Ό λ¨λ°©ν₯μΌλ‘ μ°κ²°ν©λλ€. μ μ λ μ컬 νκ²½μ μ½λκ° λ‘λλλ©΄ 곧λ°λ‘ μμ±λκ³ , ν¨μμ λ μ컬 νκ²½μ ν¨μκ° νΈμΆλλ©΄ 곧λ°λ‘ μμ±λ©λλ€.
- λ³μ μ μΈμ΄ μ€νλλ©΄ λ³μ μλ³μκ° μλ£κ΅¬μ‘°(λ μ컬 νκ²½)μ ν€(Key)λ‘ λ±λ‘λ©λλ€.
- λ³μ ν λΉμ΄ μΌμ΄λλ©΄ μλ£κ΅¬μ‘°μ λ³μ μλ³μμ ν΄λΉνλ κ°μ λ³κ²½ν©λλ€.
λ³μμ κ²μλ μ΄λ¬ν μλ£κ΅¬μ‘° μμμ μ΄λ£¨μ΄μ§λλ€. κ·ΈλΌ ν¨μλ μ΄λ¨κΉμ? λ€μ μμ λ₯Ό λ΄ μλ€.
// μ μ ν¨μ
function foo(){
console.log('μ μ ν¨μ foo');
}
function bar(){
// μ€μ²© ν¨μ
function foo(){
console.log('μ§μ ν¨μ foo');
}
foo();
}
bar(); // ?
μ, μ¬κΈ°μ κΈ°μ΅ν κ²μ ν¨μ μμ± μμ κ³Ό νΈμ΄μ€ν μ λλ€.
ν¨μ μ μΈλ¬ΈμΌλ‘ μ μνλ©΄ λ°νμ μ΄μ
μ ν¨μ κ°μ²΄κ° λ¨Όμ μμ±λ λ€, ν¨μ μ΄λ¦κ³Ό λμΌν μλ³μλ₯Ό μ묡μ μΌλ‘ μ μΈνκ³ μμ±λ ν¨μ κ°μ²΄λ₯Ό ν λΉν©λλ€.
μ΄μ²λΌ ν¨μλ μλ³μμ ν λΉλκΈ° λλ¬Έμ μ€μ½νλ₯Ό κ°μΌλ©°, μΌλ° λ³μμ λ€λ₯Όκ² μμ΅λλ€. μ΄λ‘μ¨ μ€μ½νλ λ³μ μλ³μ μ ν¨ν λ²μ λλ κ·μΉ
μ΄ μλ, μλ³μλ₯Ό κ²μνλ μ ν¨ν λ²μ λλ κ·μΉ
μ΄ λκ² λ€μ!
μ½λ λΈλ‘μ΄ μλ ν¨μμ μν΄ μ§μ μ€μ½νκ° μμ±λ©λλ€.
λ€λ₯Έ μΈμ΄μ λ¬λ¦¬, μλ°μ€ν¬λ¦½νΈλ var ν€μλλ‘ μ μΈλ λ³μλ ν¨μμ μ½λ λΈλ‘
λ§μ μ§μ μ€μ½νλ‘ μΈμ νλ©° μ΄λ₯Ό ν¨μ λ 벨 μ€μ½νλΌκ³ ν©λλ€.
// 1
var a = 1;
if(true){
var a = 10;
}
console.log(a); // 10
// 2
var b = 1;
function change(){
var b = 10;
console.log(b);
}
change(); // 10
console.log(b); // 10
// 3
var i = 10;
for(var i = 0; i < 5; i++){
console.log(i); // 0, 1, 2, 3, 4
}
console.log(i); // 5
var
ν€μλμ νΉμ§μΌλ‘, ν¨μ λ°μμ μ μΈν ν¨μ λ 벨 μ€μ½ν λ³μλ μ μ λ²μλ₯Ό κ°μ§λ©° ν¨μ λ°μ μ μΈν μ΄λμλ μ κ·Όν μ μμΌλ©° μλμΉ μκ² κ°μ΄ λ³κ²½λ μ μμ΅λλ€.- μ΄λ κ²°κ΅
λ©λͺ¨λ¦¬ λμ
,μ΄λ €μ΄ λλ²κΉ
λ±μ λ¬Έμ μ μ κ°μ§κ³ μμΌλ©°,λΈλ‘ λ 벨 μ€μ½ν
κ° νμνλ μμΈμ΄ λμ£ .
μ½λ λΈλ‘μ μν΄ μ§μ μ€μ½νκ° μμ±λ©λλ€.
let a = 1;
function change(){
let a = 10;
console.log(a);
}
change(); // 10
console.log(a); // 1
let
,const
μ λν΄μλ λ€μμ λ€λ£¨κΈ°λ‘ νμ£ .
μ μ μ€μ½ν(Static Scope)λΌκ³ λ ν©λλ€. μμ μ€μ½νλ₯Ό κ²°μ νλ μ€μν μ€μ½νμ λλ€.
μλμ μ½λλ₯Ό λ³΄κ³ , μκ°ν΄λ³΄λλ‘ ν κΉμ?
var a = 1;
function foo(){
var a = 10;
bar();
}
function bar(){
console.log(a);
}
foo(); // ?
bar(); // ?
μ°λ¦¬λ μ΄ μ½λμ μ€ν κ²°κ³Όλ₯Ό μ΄λ κ² μμΈ‘ν μ μμ΅λλ€.
- ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§μ λ°λΌ ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ€.
- ν¨μλ₯Ό μ΄λμ μ μνλμ§μ λ°λΌ ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ€.
1λ²
μ λμ μ€μ½ν(Dynamic Scope)λΌ νλ©°, ν¨μκ° νΈμΆλλ μμ μ λμ μΌλ‘ μμ μ€μ½νλ₯Ό κ²°μ ν©λλ€. 2λ²
μ μ§κΈ νλͺ©μμ λ€λ£¨λ μ μ μ€μ½ν(Static Scope λλ Lexical Scope)λΌκ³ νλ©°, ν¨μ μ μκ° νκ°λλ μμ μ μ μ μΌλ‘ μμ μ€μ½ν κ²°μ ν©λλ€.
μλ°μ€ν¬λ¦½νΈλ λ μ컬 μ€μ½νλ₯Ό λ°λ¦ λλ€. μ¦, ν¨μμ μμ μ€μ½νλ μΈμ λ μμ μ΄ μ μλ μ€μ½νμ λλ€. ν¨μ μ μκ° μ€νλμ΄ μμ±λ ν¨μ κ°μ²΄λ μ΄λ κ² κ²°μ λ μμ μ€μ½νλ₯Ό κΈ°μ΅νκ³ μμ΅λλ€. ν¨μκ° νΈμΆλ λλ§λ€ μμ μ€μ½νλ₯Ό μ°Έμ‘°ν΄μΌνκΈ° λλ¬Έμ΄μ£ .
λ μ컬 μ€μ½νλ μΆν λ±μ₯νλ ν΄λ‘μ (Closure)μ κΉμ κ΄κ³κ° μμΌλ©°, λ§€μ° μ€μν©λλ€. μΆν μμΈν λ€λ£Ήλλ€!
2021-09-11, karohaniμ μ€ν°λ μ€ μλ³λ μΆκ°μ μΌλ‘ 곡λΆκ° νμν λ΄μ©λ€
- μλ°μ€ν¬λ¦½νΈμ λ μ컬 νκ²½(Lexical Environment)λ μ μΈλ μμ μμ μ€μ½νλ₯Ό κ°λλ°,
this
λ... λ€λ₯Έκ°μ? μλ μμ μ½λλ₯Ό λ³΄μ£ !
const whatThis1 = function(){
console.log(this);
}
const obj = {
whatThis2: function(){
console.log(this);
}
}
console.log(whatThis2()); // Window
console.log(obj.whatThis2()); // {whatThis2: Ζ}
-
μ 리ν΄μΌν¨
-
μ°Έμ‘° Link