λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🌌 | WEB DEV/Vanilla JS

JS_기술 (2)_ IIFE(μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ ν‘œν˜„)

by KASSID 2023. 3. 16.

λͺ©μ°¨

    728x90

    JSμ—μ„œ μ‚¬μš©ν•˜λŠ” IIFE에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

    μ˜€λŠ˜λ‚ μ—λŠ” 잘 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ 과거에 μ‚¬μš©ν–ˆλ˜ μ½”λ“œλ₯Ό λΆ„μ„ν•˜κΈ° μœ„ν•΄μ„œ μ•Œμ•„λ³΄μž!

     

    1. IIFEλž€?

    μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ ν‘œν˜„(Immediately Invoked Function Expression, IIFE)은

    μ •μ˜λ˜μžλ§ˆμž μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.

     

    ꡬ쑰

    (function() {
      ...
    }) ();

    Self-Executing Anonymous Function 으둜 λΆˆλ¦¬λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λΌκ³  ν•œλ‹€.

    μ—¬κΈ°μ—μ„œλŠ” 두 개의 κ΄„ν˜Έμ— μ£Όλͺ©μ„ ν•΄μ•Όν•œλ‹€.

     

    λ¨Όμ €, 읡λͺ…ν•¨μˆ˜λ₯Ό λ‘˜λŸ¬μ‹Ό κ΄„ν˜Έμ΄λ‹€.

    이λ₯Ό ν†΅ν•΄μ„œ μ „μ—­ Scope의 λΆˆν•„μš”ν•œ λ³€μˆ˜λ“€μ— μ˜ν•œ μ˜€μ—Ό 방지와

    IIFE λ‚΄λΆ€ μ•ˆμœΌλ‘œ λ‹€λ₯Έ λ³€μˆ˜λ“€μ΄ μ ‘κ·Όν•˜λŠ” 것을 방지할 수 μžˆλ‹€.

     

    κ·Έ λ‹€μŒμœΌλ‘œλŠ” 후미에 μœ„μΉ˜ν•˜λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” κ΄„ν˜Έμ΄λ‹€.

    μ΄λ‘œμΈν•΄ JS엔진이 ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ ν•΄μ„ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.

     

    μ‚¬μš©μ²˜

    이전에 let이 μ•„λ‹Œ var둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ 주둜 μ‚¬μš©ν•˜μ˜€κ³ 

    λ”± ν•œ 번 만 μ‹œν–‰ν•  ν•¨μˆ˜μ΄κ³ , κ·Έ 결과값을 μ΄μš©ν•˜μ—¬ μ΄ˆκΈ°κ°’μœΌλ‘œ ν™œμš©ν•  κ²½μš°μ— 주둜 μ‚¬μš©ν•œλ‹€.

     

    IIFE 내뢀에 μ‚¬μš©ν•œ λ³€μˆ˜λͺ…, μƒμˆ˜λͺ…이 μ™ΈλΆ€μ˜ 것듀과 μ„œλ‘œ μΆ©λŒν•˜λŠ” 것을 막을 수 μžˆλ‹€.

    (μ˜€μ—Ό 방지!)

     

    μ˜ˆμ‹œ)

    const initMsg = (function (){
      var month = 3;
      var day = 16;
      var concentrationLv = [20, 34, 60, 65, 40, 42];
      var avgLvTemp = 0;
      for (const i of concentrationLv){
        avgLvTemp += i;
      }
      avgLvTemp /= concentrationLv.length;
      
      return `${month}μ›” ${day}일의 평균 미세먼지 λ†λ„λŠ” ${avgLvTemp}μž…λ‹ˆλ‹€.`;
    })();
    
    console.log(initMsg);
    
    >>> 3μ›” 16일의 평균 미세먼지 λ†λ„λŠ” 43.5μž…λ‹ˆλ‹€.

     

    λ§Œμ•½ μ΄λ•Œ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜μ™€ 같은 이름을 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  경우 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

    console.log(month); //λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ κ²ƒμ΄λ―€λ‘œ μ •μ˜ν•˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ 인지
    
    >>> Uncaught ReferenceError: month is not defined

    var의 νŠΉμ„± 상 letκ³Ό λ‹€λ₯΄κ²Œ 이미 μ„ μ–Έν•œ λ³€μˆ˜λͺ…μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  μž¬μ„ μ–Έμ΄ κ°€λŠ₯ν–ˆλ˜ 것을

    μœ„μ™€ 같은 λ°©λ²•μœΌλ‘œ 방지할 수 μžˆλ‹€. (λ‹€ν–‰νžˆ varκ°€ ν•¨μˆ˜ScopeλŠ” λ²—μ–΄λ‚˜μ§€ μ•Šμ•˜μŒ)

    λ˜ν•œ μ½”λ“œμ˜ 양이 λ°©λŒ€ν•œ κ²½μš°μ—λ„ μœ„μ™€ 같은 방법이 좩돌 방지에 도움을 μ€€λ‹€!

     

     

    ν•˜μ§€λ§Œ μ˜€λŠ˜λ‚ μ—λŠ” 블둝문과 let, const λ§ŒμœΌλ‘œλ„ κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

    let initMsg;
    {
      let month = 3;
      let day = 16;
      let concentrationLv = [20, 34, 60, 65, 40, 42];
      let avgLvTemp = 0;
      for (const i of concentrationLv){
        avgLvTemp += i;
      }
      avgLvTemp /= concentrationLv.length;
      
      initMsg = `${month}μ›” ${day}일의 평균 미세먼지 λ†λ„λŠ” ${avgLvTemp}μž…λ‹ˆλ‹€.`;
    }
    
    console.log(initMsg);
    
    >>> 3μ›” 16일의 평균 미세먼지 λ†λ„λŠ” 43.5μž…λ‹ˆλ‹€.

     

     

     

    λŒ“κΈ€