FRONT/JavaScript

[JS] JavaScript μŠ€μ½”ν”„

eunoia07 2021. 7. 1. 13:57

πŸ€”μŠ€μ½”ν”„λž€?


μŠ€μ½”ν”„(scope)λŠ” λ³€μˆ˜μ™€ μƒμˆ˜, λ§€κ°œλ³€μˆ˜κ°€ μ–Έμ œ μ–΄λ””μ„œ μ •μ˜λ˜λŠ”μ§€ κ²°μ •ν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄ ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜κ°€ ν•¨μˆ˜ λ°”λ”” μ•ˆμ—μ„œλ§Œ μ‘΄μž¬ν•˜λŠ” 것도 μŠ€μ½”ν”„μ˜ μΌμ’…μž…λ‹ˆλ‹€.

function f(x) {
    return x + 3;
}
f(5);
x;

μœ„μ˜ μ½”λ“œλ₯Ό 보면 f(5)λ₯Ό 톡해 ν•¨μˆ˜ fλ₯Ό 호좜 ν•˜κΈ° μ „κΉŒμ§€λŠ” xλŠ” μ‘΄μž¬ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆλ§Œ 쑴재 ν›„ ν•¨μˆ˜ λ°”λ””λ₯Ό λ²—μ–΄λ‚˜λ©΄ xλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

 

x의 μŠ€μ½”ν”„κ°€ ν•¨μˆ˜ f 라고 λΆ€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ€”κ·ΈλŸΌ, λ³€μˆ˜κ°€ μŠ€μ½”ν”„ μ•ˆμ— μžˆμ§€ μ•Šλ‹€λ©΄, λ³€μˆ˜λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ±΄κ°€μš”?

    - κΌ­ 그런건 μ•„λ‹™λ‹ˆλ‹€! μŠ€μ½”ν”„μ™€ 쑴재λ₯Ό λ°˜λ“œμ‹œ κ΅¬λ³„ν•΄μ„œ 생각해야 ν•©λ‹ˆλ‹€.

 

[πŸ’‘μŠ€μ½”ν”„μ™€ 쑴재]

μŠ€μ½”ν”„(κ°€μ‹œμ„±)
  • ν˜„μž¬ 싀행쀑인 λΆ€λΆ„, 즉 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(execution context)μ—μ„œ 보이고 μ ‘κ·Ό κ°€λŠ₯ν•œ μ‹λ³„μž
쑴재
  • μ‹λ³„μžκ°€ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœ 무언가λ₯Ό 가리킀고 μžˆλ‹€λŠ” 뜻
    (JSλŠ” 무언가가 λ”λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  해도 λ©”λͺ¨λ¦¬ λ°”λ‘œ νšŒμˆ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€! μœ μ§€ν•  ν•„μš”κ°€ μ—†λ‹€κ³  ν‘œμ‹œν•΄ 두면, 주기적으둜 λ°œμƒν•˜λŠ” κ°€λΉ„μ§€ μ½œλ ‰μ…˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•©λ‹ˆλ‹€)

πŸ”ŽJS의 정적 μŠ€μ½”ν”„


const x = 3;

function f() {
    console.log(x);
    console.log(y);
}

{
    const y = 5;
    f();
}

JS의 μŠ€μ½”ν”„λŠ” μ •μ μž…λ‹ˆλ‹€.

 

즉, μ–΄λ–€ λ³€μˆ˜κ°€ ν•¨μˆ˜ μŠ€μ½”ν”„ μ•ˆμ— μžˆλŠ”μ§€ ν•¨μˆ˜λ₯Ό 호좜 ν•  λ•Œ μ•Œ 수 μžˆλŠ” 것이 μ•„λ‹Œ μ •μ˜ν•  λ•Œ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„μ˜ μ½”λ“œλ₯Ό 보면

  - xλŠ” ν•¨μˆ˜ fλ₯Ό μ •μ˜ ν•  λ•Œ 쑴재

  - yλŠ” ν•¨μˆ˜ fλ₯Ό μ •μ˜ ν•  λ•Œ λ―Έ 쑴재 → λ‹€λ₯Έ μŠ€μ½”ν”„μ— 쑴재

  - λ‹€λ₯Έ μŠ€μ½”ν”„μ—μ„œ y μ„ μ–Έ ν›„ κ·Έ μŠ€μ½”ν”„μ—μ„œ f ν˜ΈμΆœν•˜λ”λΌλ„ yλŠ” f μŠ€μ½”ν”„μ— λ―Έ 쑴재

 

ν•¨μˆ˜ fλŠ” μžμ‹ μ΄ μ •μ˜ 될 λ•Œ μ ‘κ·Όν•  수 μžˆμ—ˆλ˜ μ‹λ³„μžμ—λŠ” μ ‘κ·Όκ°€λŠ₯ν•˜μ§€λ§Œ, ν˜ΈμΆœν•  λ–„ μŠ€μ½”ν”„μ— μžˆλŠ” μ‹λ³„μžμ— μ ‘κ·Ό λΆˆκ°€ν•˜κ³  이λ₯Ό 정적 μŠ€μ½”ν”„λΌκ³  ν•©λ‹ˆλ‹€.

πŸ“μ •μ  μŠ€μ½”ν”„ μ’…λ₯˜


- μ „μ—­ μŠ€μ½”ν”„(global scope)

- 블둝 μŠ€μ½”ν”„(block scope)

- ν•¨μˆ˜ μŠ€μ½”ν”„(function scope)

[1. μ „μ—­ μŠ€μ½”ν”„(global scope)]

μ „μ—­ μŠ€μ½”ν”„λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•  λ•Œ μ•”μ‹œμ μœΌλ‘œ μ£Όμ–΄μ§€λŠ” μŠ€μ½”ν”„μž…λ‹ˆλ‹€. μŠ€μ½”ν”„λŠ” 계측적이며 트리의 맨 μ•„λž˜μ— 바탕이 λ˜λŠ” 것이 μ „μ—­ μŠ€μ½”ν”„ μž…λ‹ˆλ‹€.

 

JavaScript ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•  λ•Œ, 즉 μ–΄λ–€ ν•¨μˆ˜λ„ ν˜ΈμΆœν•˜μ§€ μ•Šμ•˜μ„λ•Œ μ‹€ν–‰ 흐름은 μ „μ—­ μŠ€μ½”ν”„μ— μžˆμŠ΅λ‹ˆλ‹€.

μ „μ—­ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ 것(μ „μ—­ λ³€μˆ˜)은 무엇이든 ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  μŠ€μ½”ν”„μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ’₯ ν•˜μ§€λ§Œ, μ „μ—­ μŠ€μ½”ν”„μ— μ˜μ‘΄ν•˜λŠ”κ²ƒμ€ ν”Όν•΄μ•Ό ν•©λ‹ˆλ‹€.

let name = "Irena";
let age = 25;

function greet(){
    console.log(`Hello, ${name}!`);
}

function getBirthYear(){
    return new Date().getFullYear() - age;
}

이 μ½”λ“œμ˜ λ¬Έμ œλŠ” ν•¨μˆ˜κ°€ ν˜ΈμΆœν•˜λŠ” μŠ€μ½”ν”„μ— μ˜μ‘΄μ μž…λ‹ˆλ‹€. greet와 getBirthYearλŠ” μ „μ—­λ³€μˆ˜μ— μ˜μ‘΄ν•˜κ³  μžˆμ–΄ λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ μ‰½κ²Œ 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

function greet(user){
    console.log(`Hello, ${user.name}!`);
}

function getBirthYear(user){
    return new Date().getFullYear() - user.age;
}

[2. 블둝 μŠ€μ½”ν”„(block scope)]

블둝 μŠ€μ½”ν”„λŠ” κ·Έ λΈ”λ‘μ˜ μŠ€μ½”ν”„μ—μ„œλ§Œ λ³΄μ΄λŠ” μ‹λ³„μžλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

console.log('before block');
{
    console.log('inside block');
    const x = 3;
    console.log(x);
}
console.log(`outside block : x = ${x}`);

xλŠ” 블둝 μ•ˆμ—μ„œ μ •μ˜λκ³ , 블둝을 λ‚˜κ°€λŠ” μ¦‰μ‹œ x도 μŠ€μ½”ν”„ λ°–μœΌλ‘œ μ‚¬λΌμ§€λ―€λ‘œ λ§ˆμ§€λ§‰ μ€„μ—μ„œ ReferenceErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

πŸ’₯ μŠ€μ½”ν”„κ°€ μ€‘μ²©λ˜λ©΄ λ³€μˆ˜ μˆ¨κΉ€μ΄ λ°œμƒν•΄ ν˜Όλž€μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

//μŠ€μ½”ν”„ λλ‚œ λ‹€μŒ μŠ€μ½”ν”„ μ˜€λŠ” 방식
{
    const x = 'blue';
    console.log(x);
}
console.log(typeof x);
{
    const x = 3;
    console.log(x);
}
console.log(typeof x);

//μŠ€μ½”ν”„κ°€ μ€‘μ²©λ˜λŠ” 방식
{
    let x = 'blue';
    console.log(x);
    {
        let x = 3;
        console.log(x);
    }
    console.log(3);
}
console.log(typeof x);

λ‚΄λΆ€ λΈ”λ‘μ˜ xλŠ” μ™ΈλΆ€ λΈ”λ‘μ—μ„œ μ •μ˜ν•œ x와 λ‹€λ₯Έ λ³€μˆ˜λ‘œ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ xλ₯Ό μˆ¨κΈ°λŠ” νš¨κ³Όκ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ‹€ν–‰ νλ¦„μœΌλ‘œ 보면,

   - λ‚΄λΆ€ 블둝에 λ“€μ–΄κ°€ μƒˆ λ³€μˆ˜ x μ •μ˜ → 두 λ³€μˆ˜κ°€ λͺ¨λ‘ μŠ€μ½”ν”„ μ•ˆμ— 쑴재

   - λ³€μˆ˜μ˜ 이름이 κ°™μœΌλ―€λ‘œ μ™ΈλΆ€ μŠ€μ½”ν”„μ— μžˆλŠ” λ³€μˆ˜μ— μ ‘κ·Όν•  방법 없어짐

λ³€μˆ˜λ₯Ό 숨기면 κ·Έ λ³€μˆ˜λŠ” ν•΄λ‹Ή μ΄λ¦„μœΌλ‘œλŠ” μ ˆλŒ€ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

πŸ€”κ·ΈλŸΌ, μŠ€μ½”ν”„μ— λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ 확인할 수 μžˆλŠ” 방법이 μžˆμ„κΉŒμš”?

- μŠ€μ½”ν”„μ˜ 계측적인 μ„±κ²©μœΌλ‘œ μ–΄λ–€ λ³€μˆ˜κ°€ μŠ€μ½”ν”„μ— μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” μŠ€μ½”ν”„ 체인이 μ‘΄μž¬ν•©λ‹ˆλ‹€. μŠ€μ½”ν”„ 체인에 μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜λŠ” μŠ€μ½”ν”„μ— μžˆλŠ” 것이며, μˆ¨κ²¨μ§€μ§€ μ•Šμ•˜λ‹€λ©΄ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

[3. ν•¨μˆ˜ μŠ€μ½”ν”„(function scope)]

globalFunc = function(){
    console.log(blockVar);
}
let globalFunc; //μ •μ˜λ˜μ§€ μ•Šμ€ μ „μ—­ ν•¨μˆ˜
{
    let blockVar = 'a'; //블둝 μŠ€μ½”ν”„μ— μžˆλŠ” λ³€μˆ˜
    globalFunc = function(){
        console.log(blockVar);
    }
}
globalFunc();

μœ„μ˜ μ½”λ“œλŠ” globalFuncλ₯Ό ν˜ΈμΆœν•  μ‹œ μŠ€μ½”ν”„μ—μ„œ λΉ μ Έ λ‚˜μ™”μŒμ—λ„ blockVar에 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

πŸ€” μŠ€μ½”ν”„ μ•ˆμ—μ„œ μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό μ–΄λ–»κ²Œ μŠ€μ½”ν”„ λ°–μ—μ„œ μ°Έμ‘°κ°€ κ°€λŠ₯ν•œκ°€μš”?

- λ°”λ‘œ, ν΄λ‘œμ €(closure)둜 인해 μ°Έμ‘°κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” 블둝 μŠ€μ½”ν”„μ™€ λΆ€λͺ¨μΈ μ „μ—­ μŠ€μ½”ν”„κ°€ ν΄λ‘œμ €λ₯Ό ν˜•μ„±ν•©λ‹ˆλ‹€.

πŸ“’ν΄λ‘œμ €(closure)λž€?


ν΄λ‘œμ €λŠ” 독립적인 (자유) λ³€μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” ν•¨μˆ˜μ΄λ‹€. λ˜λŠ”, ν΄λ‘œμ € μ•ˆμ— μ •μ˜λœ ν•¨μˆ˜λŠ” λ§Œλ“€μ–΄μ§„ ν™˜κ²½μ„ ‘κΈ°μ–΅ν•œλ‹€’. -MDN

ν•¨μˆ˜κ°€ νŠΉμ • μŠ€μ½”ν”„μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ μ˜λ„μ μœΌλ‘œ κ·Έ μŠ€μ½”ν”„μ—μ„œ μ •μ˜ν•˜λŠ” 경우, μŠ€μ½”ν”„λ₯Ό ν•¨μˆ˜ μ£Όλ³€μœΌλ‘œ μ’νžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

let f;
{
    let o = {node : 'Safe'};
    f = function(){
        return o;
    }
}
let oRef = f();
oRef.note = "Not so safe after all!";

ν•¨μˆ˜λŠ” ν΄λ‘œμ €μ— λ“€μ–΄μžˆλŠ” μ‹λ³„μžμ— μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.

  - μŠ€μ½”ν”„ μ•ˆμ—μ„œ ν•¨μˆ˜ μ •μ˜ μ‹œ ν•΄λ‹Ή μŠ€μ½”ν”„ 더 였래 μœ μ§€λ©λ‹ˆλ‹€.

  - 일반적으둜 μ ‘κ·Ό λΆˆκ°€ν•œ 것에 μ ‘κ·Όν•  수 μžˆλŠ” 효과 μƒκΉλ‹ˆλ‹€.

 

좜처


  • Learning JavaScript μ±… (이선 브라운 μ§€μŒ)