front-end/JavaScript

[JavaScript] 11. μŠ€μ½”ν”„

gaan 2023. 4. 4. 14:00

πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ ꡐ재) 13μž₯. μŠ€μ½”ν”„

 

01. μŠ€μ½”ν”„λž€?

μŠ€μ½”ν”„(scope, μœ νš¨λ²”μœ„)λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•œλ‹€.
μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ΄λ‹€.
  • μŠ€μ½”ν”„λŠ” λ³€μˆ˜, ν•¨μˆ˜μ™€ κΉŠμ€ 관련이 μžˆλ‹€.
  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ™€ let λ˜λŠ” const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€.

 

πŸ–₯️ 예제 μ½”λ“œ

var var1 = 1;

if (true) {
    var var2 = 2; // μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜
    if (true) {
        var var3 = 3; // μ€‘μ²©λœ μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜
    }
}

function foo() {
    var var4 = 4; // ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜

    function bar() {
        var var5 = 5; // μ€‘μ²©λœ ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜
    }
}

console.log(var1); // 1
console.log(var2); // 2
console.log(var3); // 3
console.log(var4); // ReferenceError: var4 is not defined
console.log(var5); // ReferenceError: var5 is not defined

 

➑️ λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“±)λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λ˜λŠ”λ°, 이λ₯Ό μŠ€μ½”ν”„λΌκ³  ν•œλ‹€.

 

πŸ–₯️ 예제 μ½”λ“œ

var x = 'global';

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

foo();

console.log(x); // 2

 

➑️ μ‹λ³„μž κ²°μ • : 이름이 같은 두 개의 λ³€μˆ˜ μ€‘μ—μ„œ μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지 κ²°μ •

➑️ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„λ₯Ό 톡해 μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지 κ²°μ •

➑️ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ½”λ“œμ˜ λ¬Έλ§₯을 κ³ λ €ν•œλ‹€.

β€» λ ‰μ‹œμ»¬ ν™˜κ²½ : μ½”λ“œκ°€ μ–΄λ””μ„œ μ‹€ν–‰λ˜λ©°, μ–΄λ–€ μ½”λ“œκ°€ μžˆλŠ”μ§€

 

μœ„ μ˜ˆμ œμ—μ„œ 두 개의 x λ³€μˆ˜λŠ” μ‹λ³„μž 이름이 λ™μΌν•˜μ§€λ§Œ, μžμ‹ μ˜ μœ νš¨ν•œ λ²”μœ„(μŠ€μ½”ν”„) κ°€ λ‹€λ₯Έ λ³„κ°œμ˜ λ³€μˆ˜λ‹€.

 

 


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

ꡬ뢄 μ„€λͺ… μŠ€μ½”ν”„ λ³€μˆ˜
μ „μ—­ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­ μ „μ—­ μŠ€μ½”ν”„ μ „μ—­ λ³€μˆ˜
μ§€μ—­ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€ μ§€μ—­ μŠ€μ½”ν”„ μ§€μ—­ λ³€μˆ˜

 

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

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

 

2. μ§€μ—­κ³Ό μ§€μ—­ μŠ€μ½”ν”„

  • μ§€μ—­μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•œλ‹€.
  • μ§€μ—­ λ³€μˆ˜λŠ” μžμ‹ μ˜ μ§€μ—­ μŠ€μ½”ν”„μ™€ ν•˜μœ„ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•˜λ‹€.

 


03. μŠ€μ½”ν”„ 체인

μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ˜ 쀑첩에 μ˜ν•΄ 계측적 ꡬ쑰λ₯Ό κ°€μ§„λ‹€.
μŠ€μ½”ν”„λ‹€ κ³„μΈ΅μ μœΌλ‘œ μ—°κ²°λœ 것을 μŠ€μ½”ν”„ 체인이라 ν•œλ‹€.

➑️ μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„λ₯Ό 쀑첩 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λΌ ν•œλ‹€.

 

πŸ’‘ λͺ¨λ“  μŠ€μ½”ν”„λŠ” ν•˜λ‚˜μ˜ 계측적 ꡬ쑰둜 μ—°κ²°λ˜λ©°, λͺ¨λ“  μ§€μ—­ μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„ μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„λ‹€.

πŸ’‘ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ) μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ -> μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯μ•„λ₯΄ μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό 검색

 

1. μŠ€μ½”ν”„ 체인에 μ˜ν•œ λ³€μˆ˜ 검색

  • μŠ€μ½”ν”„ 체인을 따라 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„ - μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜ 검색

⚠️ μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λŠ” ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ 자유둭게 μ°Έμ‘° O

⚠️ ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λ₯Ό μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘° X

 

2. μŠ€μ½”ν”„ 체인에 μ˜ν•œ ν•¨μˆ˜ 검색

  • ν•¨μˆ˜λ„ μ‹λ³„μžμ— ν•΄λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€.

 


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

  • 블둝 레벨 μŠ€μ½”ν”„ : ν•¨μˆ˜ λͺΈμ²΄λ§Œμ΄ μ•„λ‹ˆλΌ, λͺ¨λ“  μ½”λ“œ 블둝(if, for, while, try/catch λ“±)이 μ§€μ—­ μŠ€μ½”ν”„λ₯Ό λ§Œλ“œλŠ” 것
  • ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ : var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜κ°€ μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ μ§€μ—­ μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λŠ” 것

예제 μ½”λ“œλ₯Ό 톡해 μ‚΄νŽ΄λ³΄μž.

 

πŸ–₯️ 예제 μ½”λ“œ

var x = 1;

if (true) {
    var x = 10;
}

console.log(x); // 10

➑️ μ „μ—­ λ³€μˆ˜ xκ°€ μ„ μ–Έλ˜μ—ˆκ³ , if 문의 μ½”λ“œ 블둝 λ‚΄μ—μ„œλ„ x λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλ‹€.

➑️ μ΄λ•Œ if 문의 μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλœ x λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ‹€.

πŸ’‘ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λ§Œ μΈμ •ν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λ°–μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” λͺ¨λ‘ μ „μ—­ λ³€μˆ˜λ‹€.

 

πŸ’‘ let, const ν‚€μ›Œλ“œλŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό μ§€μ›ν•œλ‹€.

 


05. λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

μ˜ˆμ‹œ μ½”λ“œλ₯Ό 톡해 μ‚΄νŽ΄λ³΄μž.

 

πŸ–₯️ 예제 μ½”λ“œ

var x = 1;

function foo() {
    var x = 10;
    bar();
}

function bar() {
    console.log(x);
}

foo(); // ?
bar(); // ?

 

μœ„ 예제의 μ‹€ν–‰ κ²°κ³ΌλŠ” bar ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„κ°€ 무엇인지에 따라 κ²°μ •λœλ‹€.

1. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. - 동적 μŠ€μ½”ν”„

2. ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. - λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)

 

κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)λ₯Ό λ”°λ₯΄λ―€λ‘œ, ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€.

 

  • μœ„ 예제의 bar ν•¨μˆ˜λŠ” μ „μ—­μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ‹€.
  • ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ bar ν•¨μˆ˜λŠ” μ „μ—­ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 λ¨Όμ € ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • μ΄λ•Œ μƒμ„±λœ bar ν•¨μˆ˜ κ°μ²΄λŠ” μžμ‹ μ΄ μ •μ˜λœ μŠ€μ½”ν”„, 즉 μ „μ—­ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€.
  • 그리고 bar ν•¨μˆ˜κ°€ 호좜되면 호좜된 곳이 어디인지 관계없이 μžμ‹ μ΄ κΈ°μ–΅ν•˜κ³  μžˆλŠ” μ „μ—­ μŠ€μ½”ν”„λ₯Ό μƒμœ„ μŠ€μ½”ν”„λ‘œ μ‚¬μš©ν•œλ‹€.
  • λ”°λΌμ„œ ?μ—λŠ” 두 번 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜ x의 κ°’ 1 을 좜λ ₯ν•  것이닀.

 

 

πŸ“– 참고자료

https://www.inflearn.com/course/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C/dashboard