IIFE에 λŒ€ν•΄μ„œ

😒 ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ€‘μΈ ν¬μŠ€νŠΈμ—μš”! μΆ”ν›„ μ—…λ°μ΄νŠΈ ν•„μš”!


title

μ•½ ν•œ λ‹¬λ§Œμ˜ ν¬μŠ€νŠΈμ΄λ‹€.

μ§€λ‚œ ν•œ λ‹¬λ™μ•ˆ νšŒμ‚¬μΌμ— 집쀑도 ν•˜κ³ , μ„œμšΈμ— 올라온 κΈ°λ…μœΌλ‘œ μΉœκ΅¬λ“€λ„ 많이 λ§Œλ‚˜μ„œ λΈ”λ‘œκ·Έ ν¬μŠ€νŒ…μ„ μ§„ν–‰ν•˜μ§€ λͺ»ν–ˆλ‹€.. (사싀 μ•ˆν•œκ²Œ μ•„λ‹Œκ°€ 싢은데)

λ‹€μ‹œ μ—΄μ‹¬νžˆ ν•˜λ €κ³  νšŒμ‚¬μΌμ— μ§‘μ€‘ν•˜λ©΄μ„œ, λ‚˜μ—κ²Œ ν•„μš”ν•œ λ‚΄μš©λ“€μ„ μ°Ύμ•„ 보닀가 js의 κΏ€νŒκ°™μ€ μ‚¬μ΄νŠΈλ₯Ό μ°Ύκ²Œλ˜μ—ˆλ‹€.

ν•΄λ‹Ή λ‚΄μš©μ„ μ½μ–΄λ³΄λ©΄μ„œ λ‚˜κ°™μ€ javascript beginner듀이 처음보면 얼타버릴 수 μžˆλŠ”(이게 뭐지 싢은), κ·ΈλŸ¬ν•œ νŒλ“€μ΄ 많이 μ‘΄μž¬ν–ˆλ‹€! 1λ²ˆλΆ€ν„° λ§‰ν˜€μ„œ κΉœμ§λ†€λžλ‹€..

μ€‘μš”ν•œ 점은, ν•΄λ‹Ή 포슀트λ₯Ό μ½μœΌλ©΄μ„œ IIFEλΌλŠ” λ‚΄μš©μ„ 처음 μ ‘ν•˜κ²Œ λ˜μ—ˆλŠ”λ° λ”± 봐도 μΆ•μ•½μ–΄μΈκ²Œ 뭐에 λŒ€ν•œ 좕약어인지 잘 λͺ°λΌμ„œ κ²€μƒ‰ν•΄λ³΄λ‹ˆ λ‹€μŒκ³Ό κ°™κ²Œ λ‚˜μ™”λ‹€.

IIFE(Immediately Invoked Function Expressions: β€œIffy”라고 발음)λŠ” μ¦‰μ‹œ 호좜 ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ μ€„μž„λ§μž…λ‹ˆλ‹€.

μ •μ˜λ§Œ 보고도 λ‚΄κ°€ 정리해야 ν• λ§Œν•œ λ‚΄μš©μž„μ„ μ§κ°ν•˜κ²Œ λ˜μ–΄μ„œ ν•΄λ‹Ή λ‚΄μš©μ„ μ •λ¦¬ν•˜λ €λ˜ 참에 이 포슀트λ₯Ό μž‘μ„±ν•˜κ²Œ λ˜μ—ˆλ‹€!

κ·Έλž˜μ„œ μ˜€λŠ˜μ€ IIFEλŠ” 무엇인지, μ–Έμ œ μ¨μ•Όν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.


1. ν•¨μˆ˜ 선언식 / ν•¨μˆ˜ ν‘œν˜„μ‹

μœ„μ—μ„œλ„ μ„€λͺ…ν–ˆμ—ˆμ§€λ§Œ, IIFE(Immediately Invoked Function Expressions)λŠ” μ¦‰μ‹œ 호좜 ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ μ€„μž„λ§μ΄λΌκ³  ν•œλ‹€.

λ‚˜κ°™μ€ js beginner듀은 ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό ν•¨μˆ˜ 선언식에 λŒ€ν•΄μ„œ 잘 λͺ¨λ₯΄κ±°λ‚˜, λŒ€μΆ©μ€ μ•Œκ³  μžˆμ§€λ§Œ λ¬Όμ–΄λ³Ό λ•Œλ§ˆλ‹€ ν—·κ°ˆλ¦΄ 수 μžˆμœΌλ‹ˆ μ •λ¦¬ν•˜λ©΄μ„œ 가보렀고 ν•œλ‹€.

λ¨Όμ €, ν•¨μˆ˜ μ„ μ–Έμ‹μ΄λž€ λ‹€μŒκ³Ό 같은 ν•¨μˆ˜μ˜ ν˜•νƒœλ₯Ό μ˜λ―Έν•œλ‹€.

function sum(x, y) {
    return x + y
}

κ·Έλ ‡λ‹€λ©΄ ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ¬΄μ—‡μΌκΉŒ? ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ‹€μŒκ³Ό 같은 ν•¨μˆ˜μ˜ ν˜•νƒœλ₯Ό μ˜λ―Έν•œλ‹€.
var sum = function (x, y) {
    return x + y
}

λŠλ‚Œμ΄ μ˜€λŠ”κ°€? [MDN의 μ„€λͺ…](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FFunctions_and_function_scope#Defining_functions)μ—μ„œλŠ” "**ν•¨μˆ˜ ν‘œν˜„μ‹**은 **ν•¨μˆ˜ 선언식**κ³Ό λ™μΌν•œ 문법을 가지고 무기λͺ…(anonymous)ν•¨μˆ˜λ₯Ό μ΄μš©ν•  뿐이닀"라고 μ •μ˜ν•˜μ§€λ§Œ, μ΄λŠ” 사싀 κ²‰ν‘œλ©΄λ§Œ 보고 이야기할 λ•Œ μ˜³μ€ 말이닀.

μžμ„Έν•˜κ²Œ λ‚΄λΆ€λ‘œ λ“€μ–΄κ°€κ²Œ 되면 ν˜Έμ΄μŠ€νŒ…(Hoisting)μ΄λΌλŠ” κ°œλ…κ³Ό 관련이 μžˆμ§€λ§Œ, ν•΄λ‹Ή λ‚΄μš©μ˜ μƒμ„Έν•œ μ„€λͺ…은 λ‚˜μ€‘μ— 닀루도둝 ν•˜κ³  μ•„λž˜μ˜ ν•œ λ¬Έμž₯만 κΈ°μ–΅ν•˜λ„λ‘ ν•˜μž!

ν•¨μˆ˜ μ„ μ–Έ(declaration)은 μ–Έμ œλ“ μ§€ ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„(expression)은 μ•„λ‹ˆλ‹€.


2. IIFEλŠ” λ¬΄μ—‡μΈκ°€μš”?

이제 그럼 본격적으둜 IIFE에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

μœ„μ—μ„œλ„ λ§ν–ˆμ§€λ§Œ, IIFEλŠ” Immediately Invoked Function Expressions으둜, ν•œκ΅­μ–΄λ‘œ μ§μ—­ν•˜λ©΄ μ¦‰μ‹œ 호좜 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ˜λ―Έν•œλ‹€.

그럼 IIFEλŠ” μ–΄λ–»κ²Œ λ§Œλ“œλŠ”κ±ΈκΉŒ? λ‹€μŒμ˜ μ˜ˆμ‹œλ₯Ό ν™•μΈν•΄λ³΄μž.

function addTogether() {
    var x = 10
    var y = 20
    var answer = x + y
    console.log(answer)
}

addTogether()

일반적인 ν•¨μˆ˜ μ„ μ–Έμ‹μ΄μ—¬μ„œ μ‹€λ§ν•˜μ…¨μ„μˆ˜λ„ μžˆμ§€λ§Œ, μ—¬κΈ°μ„œλΆ€ν„° μ‹œμž‘ν•˜λ©΄λœλ‹€.

μš°λ¦¬κ°€ μ—¬κΈ°μ„œ IIFEλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € μ†Œκ΄„ν˜Έ(brackets)으둜 ν•¨μˆ˜λ₯Ό κ°μ‹ΈλŠ” 것 λΆ€ν„° μ‹œμž‘ν•œλ‹€. κ·Έλ ‡κ²Œ λœλ‹€λ©΄ μœ„μ˜ ν•¨μˆ˜λŠ”,

(function addTogether() {
    var x = 10
    var y = 20
    var answer = x + y
    console.log(answer)
})

μœ„μ™€ 같은 λ‚΄μš©μ΄ 될 것이닀. μ—¬κΈ°μ„œ μš°λ¦¬λŠ” **IIFE**κ°€ **ν•¨μˆ˜ ν‘œν˜„μ‹**μž„μ„ λ‹€μ‹œ ν•œ 번 μƒκΈ°ν•˜λ©΄, λ‹€μŒκ³Ό 같이 λ°”κΏ€ 수 μžˆμ„ 것이닀.
(function() {
    var x = 10
    var y = 20
    var answer = x + y
    console.log(answer)
})

μ™œ μ΄λ ‡κ²Œ λ³€ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² λŠ” 뢄듀은 κΈ€μ˜ μ„œλ‘λΆ€ν„° 천천히 μ½μœΌμ‹œλ©΄ μ™œ κ·ΈλŸ°μ§€ μ•Œκ²Œ 될 것이닀! λ„ˆλ¬΄ μ‰¬μš΄ λ‚΄μš©μ΄λ‹ˆ νŒ¨μŠ€ν•˜κ² λ‹€.

그리고 μœ„μ˜ λ‚΄μš©μ΄ 이제 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄ λ˜μ—ˆλŠ”λ°, μš°λ¦¬κ°€ 이 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ¦‰μ‹œ 호좜 μ‹œμΌœμ•Ό IIFEκ°€ λ˜λŠ”κ²ƒμ΄λ‹€! κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬κ°€ μœ„μ˜ ν•¨μˆ˜μ‹μ„ μ–΄λ–»κ²Œ ν˜ΈμΆœν•  수 μžˆμ„κΉŒ? λ‹€μŒκ³Ό 같이 ν•˜λ©΄ λœλ‹€.

(function() {
    var x = 10
    var y = 20
    var answer = x + y
    console.log(answer)
})()

차이점이 λ³΄μ΄λŠ”κ°€? λ°”λ‘œ 뒀에 또 μ†Œκ΄„ν˜Έ(brackets)λ₯Ό λ„£μ—ˆλ‹€! μš°λ¦¬κ°€ 일반적으둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•¨μˆ˜λͺ…을 μ“΄ λ’€, 뒀에 μ†Œκ΄„ν˜Έλ₯Ό λΆ™νžˆλŠ”κ²Œ μΌλ°˜μ μ΄λ‹€. μ΄λ ‡κ²Œ IIFEκ°€ μ™„μ„±λ˜μ—ˆλ‹€!


3. μ™œ IIFEλ₯Ό μ‚¬μš©ν•˜λ‚˜μš”?

dangerousness_of_global_variable

Google에 global variable dangerous라고 치면 λ‚˜μ˜€λŠ” κΈ€. EVIL이라고 ν‘œν˜„ν•  정도이닀.

μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄μ„œ

λ§Žμ€ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ μ „μ—­ λ³€μˆ˜μ˜ νŽΈλ¦¬ν•¨μ— λŒ€ν•΄μ„œ μΈμ§€ν•˜κ³  μžˆμ§€λ§Œ, κ·Έκ²ƒμ˜ side-effect도 λ™μ‹œμ— μΈμ§€ν•˜κ³  μžˆμ„κ±°λ‹€.

λ§Žμ€ μ‚¬λžŒλ“€λ„ λ˜λ„λ‘ μ•ˆμ“°λŠ”κ²Œ μ’‹λ‹€κ³  μƒκ°ν•˜λŠ” 만큼, 그것이 μš°λ¦¬μ—κ²Œ κ°€μ Έλ‹€ 쀄 νŽΈλ¦¬ν•¨λ³΄λ‹€ 그것이 μš°λ¦¬μ—κ²Œ κ°€μ Έλ‹€ 쀄 μœ„ν—˜μ„±μ΄ λ„ˆλ¬΄ 크닀.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ§Žμ€ μ‚¬λžŒλ“€μ€, μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ°λ₯Ό κΊΌλ €ν•˜κ³  λ‚˜ λ˜ν•œ κ·Έλ ‡κ²Œ λ°°μ›Œμ™”λ‹€.

였늘 ν¬μŠ€νŠΈμ—μ„œ 봀던 IIFE같은 κ²½μš°λŠ” μ „μ—­λ³€μˆ˜μ˜ μ‚¬μš©μ„ μ΅œμ†Œν™” ν•˜κΈ° μœ„ν•΄μ„œ λ§Œλ“€μ–΄μ§„ ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λ‹€. 쒋은 기법이라고 μƒκ°ν•˜κ³  있고, λ‚˜μ€‘μ— μ“Έ 일이 있으면 적극적으둜 μ‚¬μš©ν•΄λ΄μ•Όκ² λ‹€!

더 μžμ„Έν•œ λ‚΄μš©λ“€μ€ λ‚΄κ°€ μ°Έκ³ ν–ˆμ—ˆλ˜ λΈ”λ‘œκ·Έμ˜ 포슀트λ₯Ό μ°Έκ³ ν•˜μ‹œλ©΄ 쒋을 것 κ°™λ‹€. 이 λ‚΄μš©μ€ λ‹¨μˆœνžˆ κ·Έ λ‚΄μš©λ“€μ„ μ •λ¦¬ν•œ μ •λ„μ΄λ‹ˆ :)

What is an IIFE in JavaScript?

Javascript IIFE μ΄ν•΄ν•˜κΈ°


Written by@[Yunhoe Ku]
For studying computer vision

GitHub