μ€μ½ν
μ€μ½ν(Scope, μ ν¨λ²μ)λ μλ°μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨ν λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μ κΈ°λ³Έμ μΈ κ°λ μΌλ‘ νμ€ν μ΄ν΄κ° νμνλ€. λ¨Όμ μλ μμ μ μ€ν κ²°κ³Όμ λν΄ μκ°ν΄λ³΄μ.
var x = 'global';
function foo () {
var x = 'function scope';
console.log(x);
}
foo(); // ?
console.log(x); // ?
μ΄λ¦μ΄ κ°μ λ³μ xκ° μ€λ³΅ μ μΈλμλ€. μ μμμ λ³μ xλ₯Ό μ°Έμ‘°ν λ, κ·Έλ¦¬κ³ ν¨μ foo λ΄λΆμμ λ³μ xλ₯Ό μ°Έμ‘°ν λ μ΄λ¦μ΄ μ€λ³΅λ 2κ°μ λ³μ μ€ μ΄λ€ λ³μλ₯Ό μ°Έμ‘°ν΄μΌ νλκ°? μλ°μ€ν¬λ¦½νΈλ μ΄λ»κ² λ³μλ₯Ό μλ³νλ κ²μΌκΉ?
μ€μ½νλ μ°Έμ‘° λμ μλ³μ(identifier, λ³μ, ν¨μμ μ΄λ¦κ³Ό κ°μ΄ μ΄λ€ λμμ λ€λ₯Έ λμκ³Ό ꡬλΆνμ¬ μλ³ν μ μλ μ μΌν μ΄λ¦)λ₯Ό μ°Ύμλ΄κΈ° μν κ·μΉμ΄λ€. μλ°μ€ν¬λ¦½νΈλ μ΄ κ·μΉλλ‘ μλ³μλ₯Ό μ°Ύλλ€.
νλ‘κ·Έλλ°μ λ³μλ₯Ό μ μΈνκ³ κ°μ ν λΉνλ©° λ³μλ₯Ό μ°Έμ‘°νλ κΈ°λ³Έμ μΈ κΈ°λ₯μ μ 곡νλ©° μ΄κ²μΌλ‘ νλ‘κ·Έλ¨μ μνλ₯Ό κ΄λ¦¬ν μ μλ€. λ³μλ μ μ λλ μ½λ λΈλ‘(if, for, while, try/catch λ±)μ΄λ ν¨μ λ΄μ μ μΈνλ©° μ½λ λΈλ‘μ΄λ ν¨μλ μ€μ²©λ μ μλ€. μλ³μλ μμ μ΄ μ΄λμμ μ μΈλλμ§μ μν΄ μμ μ΄ μ ν¨ν(λ€λ₯Έ μ½λκ° μμ μ μ°Έμ‘°ν μ μλ) λ²μλ₯Ό κ°λλ€.
μ μμ μμ μ μμ μ μΈλ λ³μ xλ μ΄λμλ μ°Έμ‘°ν μ μλ€. νμ§λ§ ν¨μ foo λ΄μμ μ μΈλ λ³μ xλ ν¨μ foo λ΄λΆμμλ§ μ°Έμ‘°ν μ μκ³ ν¨μ μΈλΆμμλ μ°Έμ‘°ν μ μλ€. μ΄λ¬ν κ·μΉμ μ€μ½νλΌκ³ νλ€.
λ§μ½ μ€μ½νκ° μλ€λ©΄ μ΄λ»κ² λ κΉ? μ€μ½νκ° μλ€λ©΄ κ°μ μλ³μ μ΄λ¦μ μΆ©λμ μΌμΌν€λ―λ‘ νλ‘κ·Έλ¨ μ 체μμ νλλ°μ μ¬μ©ν μ μλ€. λλ ν°λ¦¬κ° μλ μ»΄ν¨ν°λ₯Ό μκ°ν΄λ³΄μ. λλ ν°λ¦¬κ° μλ€λ©΄ κ°μ μ΄λ¦μ κ°λ νμΌμ νλλ°μ λ§λ€ μ μλ€. μ€μ½νλ μ΄μ κ°μ΄ μλ³μ μ΄λ¦μ μΆ©λμ λ°©μ§νλ€.
μ€μ½νμ ꡬλΆ
μλ°μ€ν¬λ¦½νΈμμ μ€μ½νλ₯Ό ꡬλΆν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ 2κ°μ§λ‘ λλ μ μλ€.
μ μ μ€μ½ν (Global scope)
μ½λ μ΄λμμλ μ§ μ°Έμ‘°ν μ μλ€.
μ§μ μ€μ½ν (Local scope or Function-level scope)
ν¨μ μ½λ λΈλ‘μ΄ λ§λ μ€μ½νλ‘ ν¨μ μμ κ³Ό νμ ν¨μμμλ§ μ°Έμ‘°ν μ μλ€. λͺ¨λ λ³μλ μ€μ½νλ₯Ό κ°λλ€.
λ³μμ κ΄μ μμ μ€μ½νλ₯Ό ꡬλΆνλ©΄ λ€μκ³Ό κ°μ΄ 2κ°μ§λ‘ λλ μ μλ€.
μ μ λ³μ (Global variable)
μ μμμ μ μΈλ λ³μμ΄λ©° μ΄λμλ μ°Έμ‘°ν μ μλ€.
μ§μ λ³μ (Local variable)
μ§μ(ν¨μ) λ΄μμ μ μΈλ λ³μμ΄λ©° κ·Έ μ§μκ³Ό κ·Έ μ§μμ νλΆ μ§μμμλ§ μ°Έμ‘°ν μ μλ€.
λ³μλ μ μΈ μμΉ(μ μ λλ μ§μ)μ μν΄ μ€μ½νλ₯Ό κ°μ§κ² λλ€. μ¦, μ μμμ μ μΈλ λ³μλ μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μμ΄κ³ , μ§μ(μλ°μ€ν¬λ¦½νΈμ κ²½μ° ν¨μ λ΄λΆ)μμ μ μΈλ λ³μλ μ§μ μ€μ½νλ₯Ό κ°λ μ§μ λ³μκ° λλ€.
μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μλ μ μ(μ½λ μ΄λμλ μ§)μμ μ°Έμ‘°ν μ μλ€. μ§μ(ν¨μ λ΄λΆ)μμ μ μΈλ μ§μ λ³μλ κ·Έ μ§μκ³Ό κ·Έ μ§μμ νλΆ μ§μμμλ§ μ°Έμ‘°ν μ μλ€.
μλ°μ€ν¬λ¦½νΈ μ€μ½νμ νΉμ§
μλ°μ€ν¬λ¦½νΈλ λλΆλΆ μΈμ΄μ λΈλ‘ λ 벨 μ€μ½ν(block-level scope)
λ₯Ό λ°λ₯΄λ λμ , ν¨μ λ 벨 μ€μ½ν(function-level scope)
λ₯Ό λ°λ₯Έλ€.
ν¨μ λ 벨 μ€μ½νλ ν¨μ μ½λ λΈλ‘ λ΄μμ μ μΈλ λ³μλ ν¨μ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νκ³ ν¨μ μΈλΆμμλ μ ν¨νμ§ μλ€(μ°Έμ‘°ν μ μλ€)λ κ²μ΄λ€.
var x = 0;
{
var x = 1;
console.log(x); // 1
}
console.log(x); // 1
let y = 0;
{
let y = 1;
console.log(y); // 1
}
console.log(y); // 0
μ μ μ€μ½ν(Global scope)
μ μμ λ³μλ₯Ό μ μΈνλ©΄ μ΄ λ³μλ μ΄λμλ μ§ μ°Έμ‘°ν μ μλ μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μκ° λλ€. var ν€μλλ‘ μ μΈν μ μ λ³μλ μ μ κ°μ²΄(Global Object) windowμ νλ‘νΌν°μ΄λ€.
var global = 'global';
function foo() {
var local = 'local';
console.log(global);
console.log(local);
}
foo();
console.log(global);
console.log(local); // Uncaught ReferenceError: local is not defined
λ³μ globalμ ν¨μ μμ λ°μ μ μμμ μ μΈλμλ€. μλ°μ€ν¬λ¦½νΈλ ν μΈμ΄μλ λ¬λ¦¬ νΉλ³ν μμμ (Entry point)μ΄ μμ΄μ μ μ½λμ κ°μ΄ μ μμ λ³μλ ν¨μλ₯Ό μ μΈνκΈ° μ½λ€.
μ μ λ³μμ μ¬μ©μ λ³μ μ΄λ¦μ΄ μ€λ³΅λ μ μκ³ , μλμΉ μμ μ¬ν λΉμ μν μν λ³νλ‘ μ½λλ₯Ό μμΈ‘νκΈ° μ΄λ ΅κ² λ§λλ―λ‘ μ¬μ©μ μ΅μ νμ¬μΌ νλ€.
λΉ λΈλ‘ λ 벨 μ€μ½ν(Non block-level scope)
if (true) {
var x = 5;
}
console.log(x);
λ³μ xλ μ½λ λΈλ‘ λ΄μμ μ μΈλμλ€. νμ§λ§ μλ°μ€ν¬λ¦½νΈλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό μ¬μ©νμ§ μμΌλ―λ‘ ν¨μ λ°μμ μ μΈλ λ³μλ μ½λ λΈλ‘ λ΄μμ μ μΈλμλ€ν μ§λΌλ λͺ¨λ μ μ μ€μ½νμ κ°κ²λλ€. λ°λΌμ λ³μ xλ μ μ λ³μμ΄λ€.
ν¨μ λ 벨 μ€μ½ν(Function-level scope)
var a = 10; // μ μλ³μ
(function () {
var b = 20; // μ§μλ³μ
})();
console.log(a); // 10
console.log(b); // "b" is not defined
μλ°μ€ν¬λ¦½νΈλ ν¨μ λ 벨 μ€μ½νλ₯Ό μ¬μ©νλ€. μ¦, ν¨μ λ΄μμ μ μΈλ 맀κ°λ³μμ λ³μλ ν¨μ μΈλΆμμλ μ ν¨νμ§ μλ€. λ°λΌμ λ³μ bλ μ§μ λ³μμ΄λ€.
var x = 'global';
function foo() {
var x = 'local';
console.log(x);
}
foo(); // local
console.log(x); // global
μ μλ³μ xμ μ§μλ³μ xκ° μ€λ³΅ μ μΈλμλ€. μ μ μμμμλ μ μλ³μλ§μ΄ μ°Έμ‘° κ°λ₯νκ³ ν¨μ λ΄ μ§μ μμμμλ μ μκ³Ό μ§μ λ³μ λͺ¨λ μ°Έμ‘° κ°λ₯νλ μ μμ μ κ°μ΄ λ³μλͺ μ΄ μ€λ³΅λ κ²½μ°, μ§μλ³μλ₯Ό μ°μ νμ¬ μ°Έμ‘°νλ€.
λ€μμ ν¨μ λ΄μ μ‘΄μ¬νλ ν¨μμΈ λ΄λΆ ν¨μμ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ.
var x = 'global';
function foo() {
var x = 'local';
console.log(x);
function bar() { // λ΄λΆν¨μ
console.log(x); // ?
}
bar();
}
foo();
console.log(x); // ?
λ΄λΆν¨μλ μμ μ ν¬ν¨νκ³ μλ μΈλΆν¨μμ λ³μμ μ κ·Όν μ μλ€. μ΄λ λ§€μ° μ μ©νλ€. ν΄λ‘μ μμμ κ°μ΄ λ΄λΆν¨μκ° λ μ€λ μμ‘΄νλ κ²½μ°, ν μΈμ΄μλ λ€λ₯Έ μμ§μμ 보μΈλ€.
ν¨μ barμμ μ°Έμ‘°νλ λ³μ xλ ν¨μ fooμμ μ μΈλ μ§μλ³μμ΄λ€. μ΄λ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ μν΄ μ°Έμ‘° μμμμ μ μλ³μ xκ° λ€λ‘ λ°λ ΈκΈ° λλ¬Έμ΄λ€.
var x = 10;
function foo() {
x = 100;
console.log(x);
}
foo();
console.log(x); // ?
ν¨μ(μ§μ) μμμμ μ μλ³μλ₯Ό μ°Έμ‘°ν μ μμΌλ―λ‘ μ μλ³μμ κ°λ λ³κ²½ν μ μλ€. λ΄λΆ ν¨μμ κ²½μ°, μ μλ³μλ λ¬Όλ‘ μμ ν¨μμμ μ μΈν λ³μμ μ κ·Ό/λ³κ²½μ΄ κ°λ₯νλ€.
var x = 10;
function foo(){
var x = 100;
console.log(x);
function bar(){ // λ΄λΆν¨μ
x = 1000;
console.log(x); // ?
}
bar();
}
foo();
console.log(x); // ?
μ€μ²© μ€μ½νλ κ°μ₯ μΈμ ν μ§μμ μ°μ νμ¬ μ°Έμ‘°νλ€.
var foo = function ( ) {
var a = 3, b = 5;
var bar = function ( ) {
var b = 7, c = 11;
// μ΄ μμ μμ aλ 3, bλ 7, cλ 11
a += b + c;
// μ΄ μμ μμ aλ 21, bλ 7, cλ 11
};
// μ΄ μμ μμ aλ 3, bλ 5, cλ not defined
bar( );
// μ΄ μμ μμ aλ 21, bλ 5
};
λ μ컬 μ€μ½ν(Lexical scope)
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
μ μμ μ μ€ν κ²°κ³Όλ ν¨μ barμ μμ μ€μ½νκ° λ¬΄μμΈμ§μ λ°λΌ κ²°μ λλ€. λκ°μ§ ν¨ν΄μ μμΈ‘ν μ μλλ° μ²«λ²μ§Έλ ν¨μλ₯Ό μ΄λμ νΈμΆνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ κ²μ΄κ³ λλ²μ§Έλ ν¨μλ₯Ό μ΄λμ μ μΈνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ κ²μ΄λ€. 첫λ²μ§Έ λ°©μμΌλ‘ ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ€λ©΄ ν¨μ barμ μμ μ€μ½νλ ν¨μ fooμ μ μμΌ κ²μ΄κ³ , λλ²μ§Έ λ°©μμΌλ‘ ν¨μμ μ€μ½νλ₯Ό κ²°μ νλ€λ©΄ ν¨μ barμ μ€μ½νλ μ μμΌ κ²μ΄λ€.
νλ‘κ·Έλλ° μΈμ΄λ μ΄ λκ°μ§ λ°©μ μ€ νλμ λ°©μμΌλ‘ ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ€. 첫λ²μ§Έ λ°©μμ λμ μ€μ½ν(Dynamic scope)λΌ νκ³ , λλ²μ§Έ λ°©μμ λ μ컬 μ€μ½ν(Lexical scope) λλ μ μ μ€μ½ν(Static scope)λΌ νλ€. μλ°μ€ν¬λ¦½νΈλ₯Ό λΉλ‘―ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄λ λ μ컬 μ€μ½νλ₯Ό λ°λ₯Έλ€.
λ μ컬 μ€μ½νλ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§κ° μλλΌ μ΄λμ μ μΈνμλμ§μ λ°λΌ κ²°μ λλ€. μλ°μ€ν¬λ¦½νΈλ λ μ컬 μ€μ½νλ₯Ό λ°λ₯΄λ―λ‘ ν¨μλ₯Ό μ μΈν μμ μ μμ μ€μ½νκ° κ²°μ λλ€. ν¨μλ₯Ό μ΄λμμ νΈμΆνμλμ§λ μ€μ½ν κ²°μ μ μλ¬΄λ° μλ―Έλ₯Ό μ£Όμ§ μλλ€. μ μμ μ ν¨μ barλ μ μμ μ μΈλμλ€. λ°λΌμ ν¨μ barμ μμ μ€μ½νλ μ μ μ€μ½νμ΄κ³ μ μμ λ μ μ λ³μ xμ κ° 1μ λλ² μΆλ ₯νλ€.
μ묡μ μ μ
var x = 10; // μ μ λ³μ
function foo () {
// μ μΈνμ§ μμ μλ³μ
y = 20;
console.log(x + y);
}
foo(); // 30
μ μμ μ yλ μ μΈνμ§ μμ μλ³μμ΄λ€. λ°λΌμ y = 20μ΄ μ€νλλ©΄ μ°Έμ‘° μλ¬κ° λ°μν κ²μ²λΌ 보μΈλ€. νμ§λ§ μ μΈνμ§ μμ μλ³μ yλ λ§μΉ μ μΈλ λ³μμ²λΌ λμνλ€. μ΄λ μ μΈνμ§ μμ μλ³μμ κ°μ ν λΉνλ©΄ μ μ κ°μ²΄μ νλ‘νΌν°κ° λκΈ° λλ¬Έμ΄λ€.
foo ν¨μκ° νΈμΆλλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ λ³μ yμ κ°μ ν λΉνκΈ° μν΄ λ¨Όμ μ€μ½ν 체μΈμ ν΅ν΄ μ μΈλ λ³μμΈμ§ νμΈνλ€. μ΄λ foo ν¨μμ μ€μ½νμ μ μ μ€μ½ν μ΄λμμλ λ³μ yμ μ μΈμ μ°Ύμ μ μμΌλ―λ‘ μ°Έμ‘° μλ¬κ° λ°μν΄μΌ νμ§λ§ μλ°μ€ν¬λ¦½νΈ μμ§μ y = 20μ window.y = 20μΌλ‘ ν΄μνμ¬ νλ‘νΌν°λ₯Ό λμ μμ±νλ€. κ²°κ΅ yλ μ μ κ°μ²΄μ νλ‘νΌν°κ° λμ΄ λ§μΉ μ μ λ³μμ²λΌ λμνλ€. μ΄λ¬ν νμμ μ묡μ μ μ(implicit global)μ΄λΌ νλ€.
νμ§λ§ yλ λ³μ μ μΈμμ΄ λ¨μ§ μ μ κ°μ²΄μ νλ‘νΌν°λ‘ μΆκ°λμμ λΏμ΄λ€. λ°λΌμ yλ λ³μκ° μλλ€. λ°λΌμ λ³μκ° μλ yλ λ³μ νΈμ΄μ€ν μ΄ λ°μνμ§ μλλ€.
// μ μ λ³μ xλ νΈμ΄μ€ν
μ΄ λ°μνλ€.
console.log(x); // undefined
// μ μ λ³μκ° μλλΌ λ¨μ§ μ μ νλ‘νΌν°μΈ yλ νΈμ΄μ€ν
μ΄ λ°μνμ§ μλλ€.
console.log(y); // ReferenceError: y is not defined
var x = 10; // μ μ λ³μ
function foo () {
// μ μΈνμ§ μμ λ³μ
y = 20;
console.log(x + y);
}
foo(); // 30
λν λ³μκ° μλλΌ λ¨μ§ νλ‘νΌν°μΈ yλ delete μ°μ°μλ‘ μμ ν μ μλ€. μ μ λ³μλ νλ‘νΌν°μ΄μ§λ§ delete μ°μ°μλ‘ μμ ν μ μλ€.\
var x = 10; // μ μ λ³μ
function foo () {
// μ μΈνμ§ μμ λ³μ
y = 20;
console.log(x + y);
}
foo(); // 30
console.log(window.x); // 10
console.log(window.y); // 20
delete x; // μ μ λ³μλ μμ λμ§ μλλ€.
delete y; // νλ‘νΌν°λ μμ λλ€.
console.log(window.x); // 10
console.log(window.y); // undefined
μ€μ½ν 체μΈ
scope
λ μλ³μμ λν μ ν¨ λ²μλ₯Ό λνλΈλ€. μ΄λ€ κ²½κ³ Aμ μΈλΆμμ μ μΈν λ³μλ Aμ μΈλΆλΏ μλλΌ Aμ λ΄λΆμμλ μ κ·Όμ΄ κ°λ₯νμ§λ§, Aμ λ΄λΆμμ μ μΈν λ³μλ μ€μ§ Aμ λ΄λΆμμλ§ μ κ·Όν μ μλ€. μ΄λ¬ν μλ³μμ μ ν¨λ²μλ₯Ό μμμλΆν° λ°κΉ₯μΌλ‘ μ°¨λ‘λ‘ κ²μν΄λκ°λ κ²μ μ€μ½ν 체μΈ
μ΄λΌκ³ λΆλ₯Έλ€. μ΄λ outerEnvironmentReference
λ νμ¬ νΈμΆλ ν¨μκ° μ μΈλ λΉμμ L.Eλ₯Ό μ°Έμ‘°νκ²λλλ°, μ€μν μ μ κ³Όκ±° λΉμ μ μΈλ μμ μ΄λ€.
var x = 1;
function foo(){
var x = 10;
bar();
}
function bar(){
console.log(x);
}
foo(); // 1
bar(); // 1
λ€μ μ½λμ foo()μ bar()μ μΆλ ₯κ°μ 1λ‘ λμΌνλ°, κ·Έ μ΄μ λ function barκ° μ μΈλ μμ μ xλ μ μ λ³μμΈ xλ₯Ό λ°λΌλ³΄κ² λλ€. μ¦, thisμ²λΌ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§ μν₯μ λ°λ κ²μ΄ μλλΌ ν¨μλ₯Ό μ΄λμμ μ μνλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€. ν¨μκ° νΈμΆλ μμΉλ μμ μ€μ½ν κ²°μ μ μ΄λ ν μν₯λ μ£Όμ§ μλλ€. μ¦, ν¨μμ μμ μ€μ½νλ μΈμ λ μμ μ΄ μ μλ μ€μ½νλ€. ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ bar ν¨μλ μ μμμ μ μλ ν¨μλ€. κ·Έλ¬λ―λ‘ μ μ μ½λκ° μ€νλκΈ° μ μ λ¨Όμ νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ€. μ΄λ μμ±λ bar ν¨μ κ°μ²΄λ μ μ μ€μ½νλ₯Ό κΈ°μ΅νλ€. κ·Έλ¦¬κ³ bar ν¨μκ° νΈμΆλλ©΄ νΈμΆλ κ³³μ΄ μ΄λμΈμ§ κ΄κ³μμ΄ μΈμ λ μμ μ΄ κΈ°μ΅νκ³ μλ μ μ μ€μ½νλ₯Ό μμ μ€μ½νλ‘ μ¬μ©νλ€.
μΆκ°λ‘ μ½μΌλ©΄ μ’μ κΈ
Reference
'π₯ Front-End > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JS] μ€ν 컨ν μ€νΈ, νΈμ΄μ€ν , ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμ (0) | 2022.07.21 |
---|---|
[JS] ν΄λ‘μ (Closure) (0) | 2022.07.21 |
[JS] JavaScript κ°μ²΄μ λΆλ³μ± (0) | 2022.07.20 |
[JS] JavaScriptμ μλ£νκ³Ό JavaScriptλ§μ νΉμ± (0) | 2022.07.19 |
[JS] JavaScriptμ appendλ₯Ό μ΄μ©ν HTML μμ μμ±νκΈ° (0) | 2022.05.15 |