Programming/JavaScript

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 12μž₯ ν•¨μˆ˜

yuri lee 2023. 5. 27. 12:48
λ°˜μ‘ν˜•

12.1 ν•¨μˆ˜λž€?


ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ν•¨μˆ˜λŠ” 일련의 과정을 λ¬Έ(statement)으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ κ²ƒμž…λ‹ˆλ‹€. ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μž…λ ₯을 μ „λ‹¬λ°›λŠ” λ³€μˆ˜λ₯Ό (parameter), μž…λ ₯을 (argument), 좜λ ₯을 λ°˜ν™˜κ°’return value)라고 ν•©λ‹ˆλ‹€. 

 

12.2 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유


μ½”λ“œμ˜ μž¬μ‚¬μš© μΈ‘λ©΄, μœ μ§€λ³΄μˆ˜μ™€ νŽΈμ˜μ„±μ„ 높이고 μ½”λ“œμ˜ 신뒰성을 λ†’μ΄λŠ” νš¨κ³Όκ°€ μžˆμŠ΅λ‹ˆλ‹€. 

 

12.3 ν•¨μˆ˜ λ¦¬ν„°λŸ΄


λ¦¬ν„°λŸ΄μ€ μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” 문자 λ˜λŠ” μ•½μ†λœ 기호둜 μ‚¬μš©ν•΄ 값을 μƒμ„±ν•˜λŠ” ν‘œκΈ° 방식을 λ§ν•©λ‹ˆλ‹€. 즉 λ¦¬ν„°λŸ΄μ€ 값을 μƒμ„±ν•˜κΈ° μœ„ν•œ ν‘œκΈ°λ²•μž…λ‹ˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ„ ν‰κ°€λ˜μ–΄ 값을 μƒμ„±ν•˜λ©°, 이 값은 κ°μ²΄μž…λ‹ˆλ‹€. 즉 ν•¨μˆ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

 

12.4 ν•¨μˆ˜ μ •μ˜


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

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

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

var add = function (x, y) {
  return x + y;
}

 

3. Functionμƒμ„±μž ν•¨μˆ˜

var add = new Function('x', 'y', 'return x+y')

 

4. ν™”μ‚΄ν‘œ ν•¨μˆ˜ (ES6)

var add = (x, y) => x + y;

λ³€μˆ˜λŠ” μ„ μ–Έ(declaration)ν•œλ‹€κ³  ν•˜μ§€λ§Œ ν•¨μˆ˜λŠ” μ •μ˜(definition)ν•œλ‹€κ³  ν‘œν˜„ν•©λ‹ˆλ‹€.

 

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

ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹ˆλΌ λ¬Έμž…λ‹ˆλ‹€.  ν•¨μˆ˜ 선언문이 ν‘œν˜„μ‹μΈ 문이라면 undefined λŒ€μ‹  ν‘œν˜„μ‹μ΄ ν‰κ°€λ˜μ–΄ μƒμ„±λœ ν•¨μˆ˜κ°€ 좜λ ₯λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

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

ν•¨μˆ˜λŠ” 일급 κ°μ²΄μ΄λ―€λ‘œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜ μ •μ˜ 방식을 ν•¨μˆ˜ ν‘œν˜„μ‹ (function expression)이라 ν•©λ‹ˆλ‹€. ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이고, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μΈ λ¬Έμž…λ‹ˆλ‹€.

var add = function (x, y) {
  return x + y;
}

 

12.4.3 ν•¨μˆ˜ 생성 μ‹œμ κ³Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ™€ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ˜ 생성 μ‹œμ μ€ λ‹€λ¦…λ‹ˆλ‹€. ν•¨μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” JS 고유의 νŠΉμ§•μ„ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… (Function hoisting)이라고 ν•©λ‹ˆλ‹€. ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ€ λ―Έλ¬˜ν•œ 차이가 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

 

var ν‚€μ›Œλ“œ λ³€μˆ˜μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ 선언문은 λŸ°νƒ€μž„ 이전에 JS엔진에 μ˜ν•΄ λ¨Όμ € μ‹€ν–‰λ˜λŠ” μ μ—μ„œ λ™μΌν•˜μ§€λ§Œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”λ˜κ³ , ν•¨μˆ˜ 선언문을 톡해 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ μ‹λ³„μžλŠ” ν•¨μˆ˜ 객체둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. 

 

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜μ— ν• μž₯λ˜λŠ” 값이 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μΈ λ¬Έμž…λ‹ˆλ‹€.  λ³€μˆ˜ ν• λ‹Ήλ¬Έμ˜ 값은 할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ , 즉 λŸ°νƒ€μž„μ— ν‰κ°€λ˜λ―€λ‘œ 할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ μ— ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 λ©λ‹ˆλ‹€. μ¦‰ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•©λ‹ˆλ‹€. ν•¨μˆ˜ ν‘œν˜„μ‹ 이전에 ν•¨μˆ˜ μ°Έμ‘° μ‹œ undefined둜 ν‰κ°€λ©λ‹ˆλ‹€. 

 

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 λ°˜λ“œμ‹œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•΄μ•Ό ν•œλ‹€λŠ” λ‹Ήμ—°ν•œ κ·œμΉ™μ„ λ¬΄μ‹œλ―€λ‘œ ν•¨μˆ˜μ„ μ–Έλ¬Έ λŒ€μ‹  ν•¨μˆ˜ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  것을 ꢌμž₯ν•©λ‹ˆλ‹€. 

 

12.4.4 Function μƒμ„±μž ν•¨μˆ˜

Function μƒμ„±μž ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 방식은 μΌλ°˜μ μ΄μ§€ μ•ŠμœΌλ©° λ°”λžŒμ§ν•˜μ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€. 

 

12.4.5 ν™”μ‚΄ν‘œ ν•¨μˆ˜

ES6μ—μ„œ λ„μž…λœ arrow function은 function ν‚€μ›Œλ“œ λŒ€μ‹  arrow (=>)λ₯Ό μ‚¬μš©ν•΄ κ°„λž΅ν•œ λ°©λ²•μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  γ…œγ…… μžˆμŠ΅λ‹ˆλ‹€. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 항상 읡λͺ… ν•¨μˆ˜λ‘œ μ •μ˜ν•©λ‹ˆλ‹€. 

var add = (x, y) => x + y;

 

12.5 ν•¨μˆ˜ 호좜


12.5.1 λ§€κ°œλ³€μˆ˜μ™€ 인수

λ§€κ°œλ³€μˆ˜λ³΄λ‹€ μΈμˆ˜κ°€ 더 λ§Žμ€ 경우 초과된 μΈμˆ˜λŠ” λ¬΄μ‹œλœλ‹€. 초괴된 μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ arguments 객체의 ν”„λ‘œνΌν‹°λ‘œ λ³΄κ΄€λœλ‹€. 

function add(x, y) {
  console.log(arguments) //Arguments(3) [2, 5, 10, callee: ƒ, Symbol(Symbol.iterator): ƒ]
  VM79:6 
  return x + y;
 
}
console.log(add(2, 5, 10)); //7

 

12.5.2 인수 확인 

ES6μ—μ„œ λ„μž…λœ λ§€κ°œλ³€μˆ˜ 기본값을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ λ‚΄μ—μ„œ μˆ˜ν–‰ν•˜λ˜ 인수 체크 및 μ΄ˆκΈ°ν™”λ₯Ό κ°„μ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

function add(a = 0, b = 0, c = 0) {
  return a + b + c
}

console.log(add(1, 2, 3)) // 6
console.log(add(1, 2)) //3
console.log(add(1)) //1
console.log(add()) //0

 

12.5.3 λ§€κ°œλ³€μˆ˜μ˜ μ΅œλŒ€ 개수

ECMAScript μ‚¬μ–‘μ—μ„œλŠ” λ§€κ°œλ³€μˆ˜μ˜ μ΅œλŒ€ κ°œμˆ˜μ— λŒ€ν•΄ λͺ…μ‹œμ μœΌλ‘œ μ œν•œν•˜κ³  μžˆμ§€ μ•Šμ§€λ§Œ, μ½”λ“œλ₯Ό μ΄ν•΄ν•˜λŠ” 데 λ°©ν•΄λ˜λŠ” μš”μ†Œμ΄λ―€λ‘œ 이상적인 λ§€κ°œλ³€μˆ˜λŠ” 0κ°œμž…λ‹ˆλ‹€. 적으면 μ μ„μˆ˜λ‘ μ’‹μŠ΅λ‹ˆλ‹€. 

 

12.5.4 λ°˜ν™˜λ¬Έ

ν•¨μˆ˜λŠ” return ν‚€μ›Œλ“œμ™€ ν‘œν˜„μ‹(λ°˜ν™˜κ°’)으둜 이뀄진 λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•΄ μ‹€ν–‰κ²°κ³Όλ₯Ό ν•¨μˆ˜ μ™ΈλΆ€λ‘œ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

12.6 참쑰에 μ˜ν•œ 전달과 μ™ΈλΆ€ μƒνƒœμ˜ λ³€κ²½


패슀

 

12.7 λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœ


12.7.1 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜λΌκ³  ν•©λ‹ˆλ‹€. 

(function() {
  var a = 3;
  var b = 5
  return a + b
}());

 

12.7.2 μž¬κ·€ ν•¨μˆ˜

ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ν˜ΈμΆœμ΄λΌκ³  ν•©λ‹ˆλ‹€. μž¬κ·€ ν•¨μˆ˜ λ‚΄μ—λŠ” μž¬κ·€ν˜ΈμΆœμ„ 멈좜 수 μžˆλŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ°˜λ³΅λ¬Έλ³΄λ‹€ μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 편이 더 직관적일 λ•Œλ§Œ ν•œμ •μ μœΌλ‘œ μ΄μš©ν•˜λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€. 

 

12.7.3 쀑첩 ν•¨μˆ˜

ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό μ€‘μ²©ν•¨μˆ˜(nested function) λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜(inner function)라고 ν•©λ‹ˆλ‹€. 

 

12.7.4 콜백 ν•¨μˆ˜

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜λΌκ³  ν•˜λ©°, λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ μ½œλ°±ν•˜μˆ˜λ₯Ό 전달받은 ν•¨μˆ˜λ₯Ό κ³ μ°¨ν•¨μˆ˜ (High-Order-Function)이라고 ν•©λ‹ˆλ‹€. 

 

μ½œλ°±ν•¨μˆ˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 뿐만 μ•„λ‹ˆλΌ λΉ„λ™κΈ°μ²˜λ¦¬μ— ν™œμš©λ˜λŠ” μ€‘μš”ν•œ νŒ¨ν„΄μž…λ‹ˆλ‹€. 

 

12.7.5 순수 ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ ν•¨μˆ˜

λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜ (pure funciton), μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”, 즉 λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλŠ” ν•¨μˆ˜λ₯Ό λΉ„μˆœμˆ˜ ν•¨μˆ˜(impure function)이라고 ν•©λ‹ˆλ‹€. 

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ κ²°κ΅­ μˆœμˆ˜ν•¨μˆ˜λ₯Ό 톡해 λΆ€μˆ˜νš¨κ³Όλ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•΄ 였λ₯˜λ₯Ό ν”Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„ λ†’μ΄λ €λŠ” λ…Έλ ₯의 μΌν™˜μ΄λΌ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

Reference: λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive
λ°˜μ‘ν˜•