π¨π»βπ» μ€μ½ν(Scope)
μ€μ½ν(Scope, μ ν¨λ²μ)λ μλ°μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨ν λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μ κΈ°λ³Έμ μΈ κ°λ
μ΄λ€.
μ€μ½νλ μ°Έμ‘° λμ μλ³μ(identifier, λ³μ, ν¨μμ μ΄λ¦κ³Ό κ°μ΄ μ΄λ€ λμμ λ€λ₯Έ λμκ³Ό ꡬλΆνμ¬ μλ³ν μ μλ μ μΌν μ΄λ¦)λ₯Ό μ°Ύμλ΄κΈ° μν κ·μΉμ΄λ€.
μ¦, μ΄λ€ λ³μλ₯Ό μ¬μ©νκ±°λ ν¨μλ₯Ό νΈμΆνλ €κ³ ν λ ν΄λΉνλ μλ³μλ‘ μ¬μ©νλλ°, κ·Έ μλ³μλ₯Ό κ²μνλ λ©μ»€λμ¦μ΄λΌκ³ μ΄ν΄νλ©΄ λλ€.
let x = 'global' ;
function foo ( ) {
let x = 'function scope' ;
console . log ( x ) ;
}
foo ( ) ;
console . log ( x ) ;
μ μμ μμ μ μμ μ μΈν λ³μ xλ μ΄λμλ μ°Έμ‘°ν μ μλ€. νμ§λ§ ν¨μ foo λ΄μμ μ μΈλ λ³μ xλ ν¨μ foo λ΄μμλ§ μ°Έμ‘°ν μ μλ°. μ΄λ¬ν κ·μΉμ μ€μ½νλΌκ³ νλ€.
π¨π»βπ» μ€μ½νμ ꡬλΆ
π μλ°μ€ν¬λ¦½νΈμμ μ€μ½ν
μ μ μ€μ½ν(Global Scope): μ½λ μ΄λμμλ μ§ μ°Έμ‘°ν μ μλ€.
μ§μ μ€μ½ν(Local Scope or Function-level Scope): ν¨μ μ½λ λΈλ‘μ΄ λ§λ μ€μ½νλ‘ ν¨μ μμ κ³Ό νμ ν¨μμμλ§ μ°Έμ‘°ν μ μλ€.
π λ³μ κ΄μ μμ μ€μ½ν
μ μ λ³μ(Global variable): μ μμμ μ μΈλ λ³μμ΄λ©° μ΄λμλ μ°Έμ‘°ν μ μλ€.
μ§μ λ³μ(Local variable): μ§μ λ΄μμ μ μΈλ λ³μμ΄λ©° κ·Έ μ§μκ³Ό κ·Έ μ§μμ νλΆ μ§μμμλ§ μ°Έμ‘°ν μ μλ€.
π¨π»βπ» μλ°μ€ν¬λ¦½νΈ μ€μ½νμ νΉμ§
λλΆλΆμ C-family languageλ λΈλ‘ λ 벨 μ€μ½ν(block-level-scope)λ₯Ό λ°λ₯Έλ€.
λΈλ‘ λ 벨 μ€μ½νλ, μ½λ λΈλ‘({ ... })λ΄μμ μ ν¨ν μ€μ½νλ₯Ό μλ―Ένλ€. μ¬κΈ°μ μ ν¨νλ€ λΌλ κ²μ μ°Έμ‘° ν μ μλ€λ λ»μ΄λ€.
int main (void ) {
// block-level scope
if (1 ) {
int x = 5 ;
printf (" x = %d\n " , x);
}
// ifλ¬Έ λ΄μμ μ μΈλ λ³μ xλ ifλ¬Έ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νλ€.
printf (" x = %d\n " , x); // use of undeclared identifier 'x'
return 0 ;
}
μλ°μ€ν¬λ¦½νΈλ ν¨μ λ 벨 μ€μ½ν(function-level-scope)λ₯Ό λ°λ₯Έλ€.
ν¨μ λ 벨 μ€μ½νλ, ν¨μ μ½λ λΈλ‘ λ΄μμ μ μΈλ λ³μλ ν¨μ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νκ³ ν¨μ μΈλΆμμλ μ ν¨νμ§ μλ€.
λ¨, ECMAScript6 μμ λμ
λ let keywordλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό μ¬μ©ν μ μλ€.
π¨π»βπ» μ μ μ€μ½ν
μ μμ λ³μλ₯Ό μ μΈνλ©΄ μ΄ λ³μλ μ΄λμλ μ§ μ°Έμ‘°ν μ μλ μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μκ° λλ€.
var ν€μλλ‘ μ μΈν μ μ λ³μλ μ μ κ°μ²΄(Global Object) windowμ νλ‘νΌν° μ΄λ€.
μλ°μ€ν¬λ¦½νΈλ λ€λ₯Έ C-family languageμλ λ¬λ¦¬ νΉλ³ν μμμ μ΄ μμΌλ©° μ½λκ° λνλλ μ¦μ ν΄μλκ³ μ€νλλ€. λ°λΌμ μ μμ λ³μλ₯Ό μ μΈνκΈ° μ¬μ°λ©° μ΄κ²μ μ μ λ³μλ₯Ό λ¨λ°νκ² νλ λ¬Έμ λ₯Ό μΌκΈ° μν¨λ€.
μ μ λ³μμ μ¬μ©μ λ³μ μ΄λ¦μ΄ μ€λ³΅λ μ μκ³ , μλμΉ μμ μ¬ν λΉμ μν μν λ³νλ‘ μ½λλ₯Ό μμΈ‘νκΈ° μ΄λ ΅κ² λ§λλ―λ‘ μ¬μ©μ μ§μν΄μΌ νλ€.
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
π¨π»βπ» ν¨μ λ 벨 μ€μ½ν
μλ°μ€ν¬λ¦½νΈ ECAMScript6 μ΄μ μ μ¬μ©νλ var keywordλ ν¨μ μ€μ½ν λ³μλ₯Ό μ μΈν λ μ¬μ©νλ€.
ν¨μ λ°μμ μ μΈν ν¨μ μ€μ½ν λ³μλ μ μ λ²μλ₯Ό κ°μ§κ³ , ν¨μ μμμ μ¬μ©νλ©΄ ν¨μ λ°μ μ μΈν λ΄λΆ μ΄λμλ μ κ·Όμ΄ κ°λ₯νλ€.
var a = 'global' ;
function foo ( ) {
var b = 'local1' ;
console . log ( a ) ; //global - μ μλ³μ. μΆλ ₯κ°λ₯.
if ( true ) {
var c = 'local2' ;
console . log ( b ) ; //local1 - ν΄λΉ ν¨μ λ΄ μ μΈν λ³μ. μΆλ ₯ κ°λ₯.
}
console . log ( c ) ; //local2 - ν΄λΉ ν¨μ λ΄ μ μΈν λ³μ. μΆλ ₯ κ°λ₯.
}
function bar ( ) {
var d = 'local3' ;
console . log ( d ) ; //local3 - ν΄λΉ ν¨μ λ΄ μ μΈν λ³μ. μΆλ ₯ κ°λ₯.
console . log ( a ) ; //global - μ μλ³μ. μΆλ ₯κ°λ₯.
console . log ( b ) ; //ν΄λΉ ν¨μ λ΄ μ μΈν λ³μκ° μλ. Error
console . log ( c ) ; //ν΄λΉ ν¨μ λ΄ μ μΈν λ³μκ° μλ. Error
}
foo ( ) ;
bar ( ) ;
π¨π»βπ» λΈλ‘ λ 벨 μ€μ½ν
λΈλ‘μ 0κ° μ΄μμ ꡬλΆ(statement)μ λ¬ΆκΈ°μν΄ μ¬μ©νκ³ , μ€κ΄νΈ { }λ‘ κ²½κ³λ₯Ό ꡬλΆνλ€.
ECMAScript6λΆν° λμ
λ let keywordλ λΈλ‘ μ€μ½ν λ³μλ₯Ό μ μΈν λ μ¬μ©νλ€.
λΈλ‘ μ€μ½ν λ³μλ ν¨μ λ°μμ μ μΈνλ©΄ ν¨μ μ€μ½ν λ³μμ²λΌ μ μ μ κ·Όν μ μλ€. λΈλ‘ μμμ μ μΈνλ©΄ μμ μ μ μν λΈλ‘κ³Ό νμ λΈλ‘μμλ§ μ κ·Όμ΄ κ°λ₯νλ€.
let foo = "I'm foo" ;
if ( true ) {
let bar = "I'm bar" ;
console . log ( foo ) ; //I'm foo
console . log ( bar ) ; //I'm bar
}
console . log ( foo ) ; //I'm foo
console . log ( bar ) ; //Uncaught ReferenceError: bar is not defined.
π¨π»βπ» λ μ컬 μ€μ½ν(Lexical Scope)
var x = 1 ;
function foo ( ) {
var x = 10 ;
bar ( ) ;
}
function bar ( ) {
console . log ( x ) ;
}
foo ( ) ; // ?
bar ( ) ; // ?
μ μμ μ μ€ν κ²°κ³Όλ ν¨μ barμ μμ μ€μ½νκ° λ¬΄μμΈμ§μ λ°λΌ κ²°μ λλ€. λκ°μ§ ν¨ν΄μ μμΈ‘ν μ μλ€.
첫 λ²μ§Έ, ν¨μλ₯Ό μ΄λμ νΈμΆνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ -> ν¨μ barμ μμ μ€μ½νλ ν¨μ fooμ μ μ
λ λ²μ§Έ, ν¨μλ₯Ό μ΄λμ μ μΈνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ -> ν¨μ barμ μμ μ€μ½νλ μ μ
νλ‘κ·Έλλ° μΈμ΄λ μ΄ λκ°μ§ λ°©μ μ€ νλμ λ°©μμΌλ‘ ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ€. 첫λ²μ§Έ λ°©μμ λμ μ€μ½ν(Dynamic Scope)λΌ νκ³ , λ λ²μ§Έ λ°©μμ λ μ컬 μ€μ½ν(Lexcal Scope)λλ μ μ μ€μ½ν(Static Scope)λΌ νλ€.
μλ°μ€ν¬λ¦½νΈλ₯Ό λΉλ‘―ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄λ λ μ컬 μ€μ½νλ₯Ό λ°λ₯Έλ€.
μ 리νλ©΄ μ μμ μμ ν¨μ barλ μ μμ μ μΈλμ΄μλ€. λ°λΌμ ν¨μ barμ μμ μ€μ½νλ μ μ μ€μ½νμ΄κ³ μ μμ λ μ μ λ³μ xμ κ° 1μ λλ² μΆλ ₯νλ€.