λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Javascript

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… (Function hoisting)

by ttum 2020. 1. 22.

πŸ”Ž ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄ 더 깊이 μ•Œμ•„λ³΄κΈ° : https://ttum.tistory.com/19?category=754442

 

ν•¨μˆ˜ν˜Έμ΄μŠ€νŒ…μ„ μ•ŒκΈ° μœ„ν•΄μ„œλŠ” μš°μ„  ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ— λŒ€ν•΄ μ•Œμ•„ ν•œλ‹€.

 

1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법듀 쀑 ν•˜λ‚˜μ΄λ‹€. μš°λ¦¬κ°€ 일반적으둜 Cλ‚˜ C++ λ“±μ—μ„œ μ„ μ–Έν•˜λŠ” 방식이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

ν•¨μˆ˜λ₯Ό λ…λ¦½μ μœΌλ‘œ μ„ μ–Έν•˜κ³  λ”°λ‘œ λΆˆλŸ¬μ„œ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ 이름을 κΌ­ 지정해주어야 ν•œλ‹€. ν•¨μˆ˜ 이름이 μžˆμ§€ μ•ŠμœΌλ©΄ λΆ€λ₯Ό 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

function add(a, b){
	return a + b;
}

console.log(add(3, 7)); //좜λ ₯κ°’: 10

 

2. ν•¨μˆ˜ ν‘œν˜„μ‹

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν•˜λ‚˜μ˜ ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³ , 그것을 λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 것이닀. λ¨Όμ € 예제λ₯Ό 보면 이해가 μ‰¬μšΈ 것이닀.

const add = function (a, b){
	return a + b;
}

console.log(add(3, 7)); //좜λ ₯κ°’: 10

Cλ‚˜ C++ μ½”λ“œλ§Œ 보던 μ‚¬λžŒμ€ μƒμ†Œν•˜κ²Œ 느껴질 수 μžˆμ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ μœ„μ™€κ°™μ€ μ½”λ“œκ°€ κ°€λŠ₯ν•œ 것이닀.

μ—¬κΈ°μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ˜λ‹€λ₯Έ νŠΉμ΄ν•œ 점을 λ³Ό 수 μžˆλŠ”λ°, μ΅λͺ…ν•¨μˆ˜λ‘œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것이닀. (functionν•˜κ³  κ·Έ λ’€μ˜ ν•¨μˆ˜ 이름이 μ—†λŠ” 것을 보면 μ•Œ 수 μžˆλ‹€.)

κΌ­ 읡λͺ…ν•¨μˆ˜λ‘œ ν‘œν˜„ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, μž¬κ·€ν˜ΈμΆœμ΄ ν•„μš”ν•΄μ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ κ·Έ ν•¨μˆ˜λ₯Ό 또 λΆ€λ₯΄λŠ” νŠΉμ΄ν•œ 경우λ₯Ό μ œμ™Έν•˜κ³ λŠ” 이름을 ꡳ이 지어쀄 ν•„μš”κ°€ μ—†λ‹€. ν•¨μˆ˜ν‘œν˜„μ‹ μ™ΈλΆ€μ—μ„œλŠ” ν˜ΈμΆœμ„ ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

μ•„λž˜μ˜ κ²½μš°λŠ” ν•¨μˆ˜ν‘œν˜„μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©° ν• λ‹Ήν•œ ν•¨μˆ˜μ— addFunctionμ΄λΌλŠ” 이름을 μ§€μ–΄μ£Όμ—ˆλ‹€.

const add = function addFunction(a, b){
	return a + b;
}

console.log(add(1,2)); // 좜λ ₯κ°’: 3
console.log(addFunction(1,2)); // Uncaught ReferenceError

 


κ·Έ μ΄μ™Έμ˜ Function()μƒμ„±μž ν•¨μˆ˜λ„ μžˆμœΌλ‚˜ 잘 μ‚¬μš©λ˜μ§€ μ•Šκ³  이λ₯Ό μ΄ν•΄ν•˜μ§€ μ•Šμ•„λ„ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ„ μ΄ν•΄ν•˜λŠ” λ°μ—λŠ” λ¬Έμ œκ°€ μ—†μœΌλ―€λ‘œ μƒλž΅ν•˜κ² λ‹€.

 

ν•¨μˆ˜ν˜Έμ΄μŠ€νŒ…μ΄λž€ 무엇인가?

사전에 찾아보면 "λŒμ–΄μ˜¬λ¦¬κΈ°"λΌλŠ” 뜻이 λ‚˜μ˜¨λ‹€. 무엇을 λŒμ–΄μ˜¬λ¦¬λŠλƒ? λ°”λ‘œ ν•¨μˆ˜λ₯Ό λŒμ–΄μ˜¬λ¦¬λŠ” 것이닀.

 

ν•¨μˆ˜ μ„ μ–Έλ¬Έμ˜ κ²½μš°μ—λŠ” 선언을 해두면 κ·Έ ν•¨μˆ˜μ˜ μœ νš¨λ²”μœ„κ°€ μ½”λ“œμ˜ 맨 μ²˜μŒλΆ€ν„° μ‹œμž‘ν•œλ‹€. ν•¨μˆ˜ 선언문이 제일 μœ„λ‘œ "λŒμ–΄μ˜¬λ €μ§€λŠ” 것"이닀. λ”°λΌμ„œ μ½”λ“œμ˜ λ§ˆμ§€λ§‰ λΆ€λΆ„μ˜ addλΌλŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λ”λΌλ„ μ½”λ“œμ˜ 첫 쀄에 add(2,3)을 ν˜ΈμΆœν–ˆμ„ λ•Œ, μ •μƒμ μœΌλ‘œ 호좜이 λ˜λŠ” 것이닀.

// ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… λ°œμƒ
add(3, 5) // 좜λ ₯κ°’: 8

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function add(a, b){
	return a + b;
}

μœ„μ˜ μ½”λ“œλŠ” μ •μƒμ μœΌλ‘œ λ™μž‘ν•œλ‹€. κ·ΈλŸ¬λ‚˜ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° 전에 μ‚¬μš©ν•˜λŠ” 것은 μ½”λ“œμ˜ ꡬ쑰λ₯Ό μ—‰μ„±ν•˜κ²Œ λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

반면 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ λ³΄ν†΅μ˜ κ²½μš°μ—μ„œλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹λ§Œμ„ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

add(3, 5) // uncaught type error

// ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ ν•¨μˆ˜ μ •μ˜
const add = function (a, b){
	return a + b;
}

add(3, 5) // 7

 

Reference

μΈμ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈ, ν•œλΉ›λ―Έλ””μ–΄ (μ†‘ν˜•μ£Ό, κ³ ν˜„μ€€ μ§€μŒ)