관리 메뉴

Daehyunii's Dev-blog

13μž₯ μŠ€μ½”ν”„ λ³Έλ¬Έ

13.1 μŠ€μ½”ν”„λž€?

  μŠ€μ½”ν”„λž€ μ‹λ³„μž μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„λ₯Ό λ§ν•œλ‹€. 즉, μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•œλ‹€. μ•žμ„œ κ²½ν—˜ν•œ 바와 같이 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 있고 ν•¨μˆ˜ λͺΈμ²΄ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€. 이것은 λ§€κ°œλ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” μœ νš¨λ²”μœ„, 즉 λ§€κ°œλ³€μˆ˜μ˜ μŠ€μ½”ν”„κ°€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ‘œ ν•œμ •λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

function add(x, y){
    console.log(x, y);
    return x + y;
}

console.log(add(2, 5)); //  2 5  // 7

console.log(x,y); // ReferenceErrorλ°œμƒ

  λ³€μˆ˜λŠ” μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­λΏ μ•„λ‹ˆλΌ μ½”λ“œ λΈ”λ‘μ΄λ‚˜ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œλ„ μ„ μ–Έν•  수 μžˆλ‹€. (μ΄λ•Œ μ½”λ“œ λΈ”λ‘μ΄λ‚˜ ν•¨μˆ˜λŠ” 쀑첩될 수 μžˆλ‹€.) λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ μžμ‹ μ΄ μœ νš¨ν•œ λ²”μœ„, 즉 λ‹€λ₯Έ μ½”λ“œκ°€ λ³€μˆ˜ μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” λ²”μœ„κ°€ κ²°μ •λœλ‹€. μ•žμ„œ λ§ν–ˆλ“―μ΄ λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ λͺ¨λ“  μ‹λ³„μžκ°€ κ·Έλ ‡λ‹€. 

var x = 'global';

function foo(){
    var x = 'local';
    console.log(x); // local
}

foo(); 

console.log(x); // global

  μœ„μ˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­κ³Ό foo ν•¨μˆ˜ 내뢀에 같은 이름을 κ°–λŠ” x λ³€μˆ˜λ₯Ό μ„ μ–Έν–ˆκ³  cosole.log()λ₯Ό 톡해 xλ³€μˆ˜λ₯Ό μ°Έμ‘°ν–ˆλ‹€. μ΄λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 이름이 같은 두 개의 λ³€μˆ˜ μ€‘μ—μ„œ μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지λ₯Ό κ²°μ •ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό 'μ‹λ³„μž κ²°μ •'이라 ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„λ₯Ό 톡해 μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지 κ²°μ •ν•œλ‹€. μœ„ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ— μ„ μ–Έλœ x λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“  μ°Έμ‘°ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ foo ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλœ x λ³€μˆ˜λŠ” foo ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 있고 foo ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€. μ΄λ•Œ 두 개의 λ³€μˆ˜λŠ” μ‹λ³„μž 이름이 λ™μΌν•˜μ§€λ§Œ μžμ‹ μ΄ μœ νš¨ν•œ λ²”μœ„, 즉 μŠ€μ½”ν”„κ°€ λ‹€λ₯Έ λ³„κ°œμ˜ λ³€μˆ˜λ‹€. λ§Œμ•½ μŠ€μ½”ν”„λΌλŠ” κ°œλ…μ΄ μ—†λ‹€λ©΄ 같은 이름을 κ°–λŠ” λ³€μˆ˜λŠ” μΆ©λŒμ„ μΌμ΄ν‚€λ―€λ‘œ ν”„λ‘œκ·Έλž¨ μ „μ²΄μ—μ„œ ν•˜λ‚˜λ°–μ— μ‚¬μš©ν•  수 μ—†λ‹€. 핡심은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ‹λ³„μžλŠ” μœ μΌν•΄μ•Ό ν•˜μ§€λ§Œ λ‹€λ₯Έ μŠ€μ½”ν”„μ—λŠ” 같은 μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

β€»κΈ°μ΄ˆκ°œλ…

- var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜ : 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언이 ν—ˆμš©λœλ‹€.

(쀑볡 μ„ μ–Έμ‹œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•˜μ—¬ μž¬ν• λ‹Ήμ„ ν•˜κ²Œ 됨)

- let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜ : 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

function foo(){
    var x = 1;

    var x = 2; // 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ varν‚€μ›Œλ“œλ‘œ 쀑볡 μ„ μ–Έ
    console.log(x); // 2
}

foo();


function bar(){
    let x = 1;

    let x = 2; // 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ letν‚€μ›Œλ“œλ‘œ 쀑볡 μ„ μ–Έ
    console.log(x); // SyntaxError λ°œμƒ
}

bar();

 

13.2 μŠ€μ½”ν”„μ˜ μ’…λ₯˜

  μ½”λ“œλŠ” μ „μ—­κ³Ό μ§€μ—­μœΌλ‘œ ꡬ뢄할 수 μžˆλ‹€. μ΄λ•Œ λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜, 즉 μ „μ—­ λ˜λŠ” 지역에 μ˜ν•΄ μžμ‹ μ΄ μœ νš¨ν•œ λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ κ²°μ •λœλ‹€. μ „μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°–λŠ” μ „μ—­ λ³€μˆ˜μ΄κ³ , μ§€μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 지역 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” 지역 λ³€μˆ˜λ‹€.

 

13.2.1 μ „μ—­κ³Ό μ „μ—­ μŠ€μ½”ν”„

  μ „μ—­μ΄λž€ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ„ λ§ν•œλ‹€. 전역은 μ „μ—­ μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€. 전역에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°–λŠ” μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€. μ „μ—­ λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“ μ§€ μ°Έμ‘°ν•  수 μžˆλ‹€.

 

13.2.2 지역과 지역 μŠ€μ½”ν”„

  μ§€μ—­μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•œλ‹€. 지역은 지역 μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€. 지역에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ 지역 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” 지역 λ³€μˆ˜κ°€ λœλ‹€. 지역 λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ 지역과 ν•˜μœ„ 지역(쀑첩 ν•¨μˆ˜)μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€. 지역 λ³€μˆ˜λŠ” μžμ‹ μ˜ 지역 μŠ€μ½”ν”„μ™€ ν•˜μœ„ 지역 μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•˜λ‹€. 

 

13.3 μŠ€μ½”ν”„ 체인

  λͺ¨λ“  μŠ€μ½”ν”„λŠ” ν•˜λ‚˜μ˜ 계측적 ꡬ쑰둜 μ—°κ²°λ˜λ©°, λͺ¨λ“  지역 μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„ μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„λ‹€. μŠ€μ½”ν”„κ°€ κ³„μΈ΅μ μœΌλ‘œ μ—°κ²°λœ 것을 μŠ€μ½”ν”„ 체인이라 ν•œλ‹€. λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•œλ‹€.

 

var x = 'global x';
var y = 'global y';

function outer(){
    var z = 'outer\'s local z';

    console.log(x); // global x - outerν•¨μˆ˜ λͺΈμ²΄ 내에 xμ‹λ³„μžκ°€ μ—†μœΌλ―€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ— μžˆλŠ” μ „μ—­ x λ³€μˆ˜λ₯Ό 참쑰함
    console.log(y); // global y - outerν•¨μˆ˜ λͺΈμ²΄ 내에 yμ‹λ³„μžκ°€ μ—†μœΌλ―€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ— μžˆλŠ” μ „μ—­ y λ³€μˆ˜λ₯Ό 참쑰함
    console.log(z); // outer's local z - outerν•¨μˆ˜ λͺΈμ²΄ 내에 z μ‹λ³„μžκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 지역 z λ³€μˆ˜λ₯Ό 참쑰함

    function inner(){
        var x = 'inner\'s local x';

        console.log(x); // inner's local x - innerν•¨μˆ˜ λͺΈμ²΄ 내에 xμ‹λ³„μžκ°€ λ¨Όμ € κ²€μƒ‰λ˜λ―€λ‘œ ν•΄λ‹Ή 지역 x λ³€μˆ˜λ₯Ό λ¨Όμ € 참쑰함
        console.log(y); // global y - innerν•¨μˆ˜ λͺΈμ²΄ 내에 y μ‹λ³„μžκ°€ μ—†κ³  >> outerν•¨μˆ˜ λͺΈμ²΄ 내에 y μ‹λ³„μžκ°€ μ—†μ–΄ >> μ „μ—­ λ³€μˆ˜ yλ₯Ό 참쑰함 
        console.log(z); // outer's local z - innerν•¨μˆ˜ λͺΈμ²΄ 내에 z μ‹λ³„μžκ°€ μ—†μœΌλ―€λ‘œ, μƒμœ„ μŠ€μ½”ν”„ outer ν•¨μˆ˜ 내에 μžˆλŠ” 지역 z λ³€μˆ˜λ₯Ό 참쑰함
    }

    inner();
}

outer()

console.log(x); // global x - μ „μ—­μ—μ„œ μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ΄λ―€λ‘œ 전역에 μžˆλŠ” μ „μ—­λ³€μˆ˜ xλ₯Ό 참쑰함
console.log(z); // ReferenceError - μ „μ—­μ—λŠ” μ „μ—­λ³€μˆ˜ zκ°€ μ—†μœΌλ―€λ‘œ μ°Έμ‘°μ—λŸ¬ λ°œμƒ

 

  κ°€μž₯ μ£Όμ˜ν•΄μ•Ό ν•  점은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ ˆλŒ€ ν•˜μœ„ μŠ€μ½”ν”„λ‘œ λ‚΄λ €κ°€λ©΄μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜λŠ” 일은 μ—†λ‹€. μ΄λŠ” μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λŠ” ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ 자유둭게 μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λ₯Ό μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°ν•  수 μ—†λ‹€λŠ” 것이닀!

 

13.4 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

  μ•žμ—μ„œ μ •μ˜ ν–ˆλ“―μ΄ 지역은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•˜κ³  지역은 지역 μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€κ³  ν–ˆμ—ˆλŠ”λ°, μ΄λŠ” μ½”λ“œ 블둝이 μ•„λ‹Œ ν•¨μˆ˜μ— μ˜ν•΄μ„œλ§Œ 지역 μŠ€μ½”ν”„κ°€ μƒμ„±λœλ‹€λŠ” λœ»μ΄λ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” ν•¨μˆ˜ λͺΈμ²΄λ§Œμ΄ μ•„λ‹ˆλΌ λͺ¨λ“  μ½”λ“œ 블둝이 지역 μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ„ 블둝 레벨 μŠ€μ½”ν”„λΌ ν•œλ‹€. ν•˜μ§€λ§Œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ„ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λΌ ν•œλ‹€. (참고둜 let, constν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 블둝 레벨 μŠ€μ½”ν”„ νŠΉμ§•μ„ κ°–λŠ”λ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 뒀에 배울 μ˜ˆμ •)

var x = 10; // μ „μ—­λ³€μˆ˜xλ‹€.

if(true){
    var x = 100; // μ „μ—­λ³€μˆ˜xλ‹€.(ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„)
}

function local(){
	var x = 1000; // μ§€μ—­λ³€μˆ˜xek.(ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„)
}

console.log(x); // 100 (μ „μ—­μ—μ„œ ν˜ΈμΆœλ˜μ—ˆμœΌλ―€λ‘œ, μ „μ—­μ—μ„œ λ³€μˆ˜xλ₯Ό 참쑰함)