관리 메뉴

Daehyunii's Dev-blog

12μž₯ ν•¨μˆ˜ λ³Έλ¬Έ

12.1 ν•¨μˆ˜λž€?

  ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 핡심 κ°œλ…μ΄λ‹€. ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ν•¨μˆ˜λŠ” 일련의 과정을 문으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ 것이닀. ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ •μ˜λ₯Ό 톡해 μƒμ„±ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€.

// ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜
function add(x,y){
    return x + y;
}

  ν•¨μˆ˜ μ •μ˜λ§ŒμœΌλ‘œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 것은 μ•„λ‹ˆλ‹€. 인수λ₯Ό λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ— μ „λ‹¬ν•˜λ©΄μ„œ ν•¨μˆ˜μ˜ 싀행을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ‹œν•΄μ•Ό ν•œλ‹€. 이λ₯Ό ν•¨μˆ˜ 호좜이라 ν•œλ‹€. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ½”λ“œ 블둝에 λ‹΄κΈ΄ 문듀이 μΌκ΄„μ μœΌλ‘œ μ‹€ν–‰λ˜κ³  μ‹€ν–‰ κ²°κ³Ό, 즉 λ°˜ν™˜κ°’μ„ λ°˜ν™˜ν•œλ‹€.

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

console.log(add(2,3)); // 5

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

  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 개체 νƒ€μž…μ˜ 값이닀. λ”°λΌμ„œ 숫자 값을 숫자 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜κ³  객체λ₯Ό 객체 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ ν•¨μˆ˜λ„ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€. 즉 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ 값을 μƒμ„±ν•˜λŠ” ν‘œκΈ° 방식이고 κ²°κ΅­ ν•¨μˆ˜λŠ” 객체닀.

// ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ f λ³€μˆ˜μ— ν• λ‹Ή
var f = function add(x,y){
    return x + y;
};

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

  ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법은 4가지가 μžˆλ‹€.

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

// ν•¨μˆ˜ ν‘œν˜„μ‹
var add = function(){
    return x + y;
};

// μƒμ„±μž ν•¨μˆ˜
var add = new Function('x','y','return x + y');

//ν™”μ‚΄ν‘œ ν•¨μˆ˜
var add = (x, y) => x + y;

12.4.1 ν•¨μˆ˜ μ„ μ–Έλ¬Έ

  ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ λ¦¬ν„°λŸ΄κ³Ό ν˜•νƒœκ°€ λ™μΌν•˜λ‹€. 단 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μžˆμœΌλ‚˜ ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€. ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀. κ·ΈλŸ¬λ―€λ‘œ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.

 

12.4.2 ν•¨μˆ˜ ν‘œν˜„μ‹

  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 객체 νƒ€μž…μ˜ 값이닀. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” κ°’μ²˜λŸΌ λ³€μˆ˜μ— ν• λ‹Ήν•  μˆ˜λ„ 있고 ν”„λ‘œνΌν‹° 값이 될 μˆ˜λ„ 있으며 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 μˆ˜λ„ μžˆλ‹€. 이처럼 κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 객체λ₯Ό 일급 객체라 ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체닀. ν•¨μˆ˜λŠ” 일급 κ°μ²΄μ΄λ―€λ‘œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜ μ •μ˜ 방식을 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λΌ ν•œλ‹€. ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μΈ 문이닀.

 

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

  ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ™€ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ˜ 생성 μ‹œμ μ€ λ‹€λ₯΄λ‹€. λͺ¨λ“  선언문이 κ·Έλ ‡λ“― ν•¨μˆ˜ 선언문도 μ½”λ“œκ°€ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ μΈ λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ λ¨Όμ € μ‹€ν–‰λœλ‹€. 그리고 ν•¨μˆ˜ 객체가 μ΄ˆκΈ°ν™” λœλ‹€. 이λ₯Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌκ³  ν•œλ‹€. ν•˜μ§€λ§Œ ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 경우 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€.

 

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

  μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” 빌트인 ν•¨μˆ˜μΈ Function μƒμ„±μž ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜ λͺ©λ‘κ³Ό ν•¨μˆ˜ λͺΈμ²΄λ₯Ό λ¬Έμžμ—΄λ‘œ μ „λ‹¬ν•˜λ©΄μ„œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•΄μ„œ λ°˜ν™˜ν•œλ‹€. 사싀 new μ—°μ‚°μž 없이 ν˜ΈμΆœν•΄λ„ κ²°κ³ΌλŠ” λ™μΌν•˜λ‹€.

 

12.4.5 ν™”μ‚΄ν‘œ ν•¨μˆ˜
  ES6μ—μ„œ λ„μž…λœ ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” function ν‚€μ›Œλ“œ λŒ€μ‹  ν™”μ‚΄ν‘œλ₯Ό μ‚¬μš©ν•΄ μ’€ 더 κ°„λž΅ν•œ λ°©λ²•μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 항상 읡λͺ… ν•¨μˆ˜λ‘œ μ •μ˜ν•œλ‹€. 즉, ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œλŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μ—†λ‹€.

 

12.5 ν•¨μˆ˜ 호좜

  ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžμ™€ ν•œ 쌍의 μ†Œκ΄„ν˜ΈμΈ ν•¨μˆ˜ 호좜 μ—°μ‚°μžλ‘œ ν˜ΈμΆœν•œλ‹€. ν•¨μˆ˜ 호좜 μ—°μ‚°μž λ‚΄μ—λŠ” 0개 μ΄μƒμ˜ 인수λ₯Ό μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•΄μ„œ λ‚˜μ—΄ν•œλ‹€.

 

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

  ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 값을 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ 전달할 ν•„μš”κ°€ μžˆλŠ” 경우, λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 인수λ₯Ό μ „λ‹¬ν•œλ‹€. μΈμˆ˜λŠ” κ°’μœΌλ‘œ 평가될 수 μžˆλŠ” ν‘œν˜„μ‹μ΄μ–΄μ•Ό ν•œλ‹€. μΈμˆ˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ§€μ •ν•˜λ©°, κ°œμˆ˜μ™€ νƒ€μž…μ— μ œν•œμ΄ μ—†λ‹€.

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

var result = add(1,2);
console.log(result); // 3

  λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ„ μ–Έν•˜λ©°, ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ™€ λ™μΌν•˜κ²Œ μ·¨κΈ‰λœλ‹€. 즉, ν•¨μˆ˜κ°€ 호좜되면 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œ μ•”λ¬΅μ μœΌλ‘œ λ§€κ°œλ³€μˆ˜κ°€ μƒμ„±λ˜κ³  일반 λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ undefined둜 μ΄ˆκΈ°ν™”λœ 이후 μΈμˆ˜κ°€ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλœλ‹€. λ§€κ°œλ³€μˆ˜λ³΄λ‹€ μΈμˆ˜κ°€ 더 λ§Žμ€ 경우 초과된 μΈμˆ˜λŠ” λ¬΄μ‹œλœλ‹€.(μ •ν™•ν•˜κ²Œ λ§ν•˜λ©΄ ν•¨μˆ˜μ˜ arguments 객체의 ν”„λ‘œνΌν‹°λ‘œ λ³΄κ΄€λœλ‹€.)

 

12.5.4 λ°˜ν™˜λ¬Έ

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

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

var result = add(1,2); // add ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ „μ—­ λ³€μˆ˜μΈ result에 ν• λ‹Ή
console.log(result); // 3

  ν•¨μˆ˜ ν˜ΈμΆœμ€ ν‘œν˜„μ‹μ΄λ‹€. ν•¨μˆ˜ ν˜ΈμΆœμ€ λ°˜ν™˜κ°’μ„ 가지기 λ•Œλ¬Έμ— κ°’μœΌλ‘œ ν‰κ°€λ˜λŠ” 문이며, κ·ΈλŸ¬λ―€λ‘œ ν•¨μˆ˜ ν˜ΈμΆœμ€ ν‘œν˜„μ‹μ΄λ‹€. λ°˜ν™˜λ¬Έμ€ 두 가지 역할을 ν•œλ‹€. 첫째, λ°˜ν™˜λ¬Έμ€ ν•¨μˆ˜μ˜ 싀행을 μ€‘λ‹¨ν•˜κ³  ν•¨μˆ˜ λͺΈμ²΄λ₯Ό λΉ μ Έλ‚˜κ°„λ‹€. λ”°λΌμ„œ λ°˜ν™˜λ¬Έ 이후에 λ‹€λ₯Έ 문이 μ‘΄μž¬ν•˜λ©΄ κ·Έ 문은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ¬΄μ‹œλœλ‹€.

function add(x, y){
    return x + y;
    console.log('hi!') // λ¬΄μ‹œ λœλ‹€.
}

var result = add(1,2); 
console.log(result); // 3

  λ‘˜μ§Έ, λ°˜ν™˜λ¬Έμ€ return ν‚€μ›Œλ“œ 뒀에 μ˜€λŠ” ν‘œν˜„μ‹μ„ 평가해 λ°˜ν™˜ν•œλ‹€. return ν‚€μ›Œλ“œ 뒀에 λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  ν‘œν˜„μ‹μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€. λ°˜ν™˜λ¬Έμ€ μƒλž΅ν•  수 μžˆλ‹€. μ΄λ•Œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄μ˜ λ§ˆμ§€λ§‰ λ¬ΈκΉŒμ§€ μ‹€ν–‰ν•œ ν›„ μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜λ¬Έμ€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. μ „μ—­μ—μ„œ λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•˜λ©΄ 문법 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

 

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

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

  ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λΌκ³  ν•œλ‹€. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 단 ν•œ 번만 호좜되며 λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 읡λͺ… ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

(function add(x, y){
    return x + y;
}()); // ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ 호좜됨

var result = add(1,2); // ReferenceError μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λΌ λ‹€μ‹œ 호좜 λΆˆκ°€

12.7.3 쀑첩 ν•¨μˆ˜

  ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜ λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜λΌ ν•œλ‹€. 그리고 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λΌ λΆ€λ₯Έλ‹€. 쀑첩 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€. 일반적으둜 쀑첩 ν•¨μˆ˜λŠ” μžμ‹ μ„ ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό λ•λŠ” 헬퍼 ν•¨μˆ˜μ˜ 역할을 ν•œλ‹€.

function outer(){
    var x = 1;

    function inner(){
        var y = 2;
        console.log(x + y); //3
    }
    inner()
}
outer();