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

JavaScript

[λ‚΄λ³΄λ‚΄λ²ˆ] JavaScript - JavaScript Functions — Understanding The Basics

GitHub에 μžˆλŠ” 33 Concepts Every JavaScript Developer Should Know λΌλŠ” λ¦¬ν¬μ§€ν† λ¦¬μ˜ λ‚΄μš© 쀑 κ³΅λΆ€ν•˜κ³  싢은 아티클을 λ‚΄κ°€ 정리할 κ²Έ κΈ°μ–΅ν•  κ²Έ μž‘μ„±ν•˜λŠ” λ²ˆμ—­κΈ€μ΄λ‹€. 33가지 쀑 μ—¬μ„― 번째인 Function Scope, Block Scope and Lexical Scope와 κ΄€λ ¨λœ λ‚΄μš©μ΄λ‹€.

β€» λ‚΄λ³΄λ‚΄λ²ˆ(λ‚΄κ°€ 보렀고 λ‚΄κ°€ λ²ˆμ—­ν•œ): μ˜μ–΄ μ „κ³΅μžλ„ ν•΄μ™Έ μœ ν•™νŒŒλ„ μ•„λ‹ˆκΈ°μ— λ²ˆμ—­μ—λŠ” μ˜μ—­, μ˜€μ—­, κ΅¬κΈ€ λ²ˆμ—­μ΄ λ¬΄μˆ˜νžˆ λ§Žμ„ 수 있으며, μ˜€νƒ€λ„ λ§Žμ„ 수 μžˆλ‹€. μ •ν™•ν•œ λ‚΄μš©μ€ 원문을 직접 μ‚΄νŽ΄λ³΄κ±°λ‚˜ λ‹€λ₯Έ 정보듀을 더 μ°Ύμ•„λ³΄λŠ” 것을 μΆ”μ²œν•œλ‹€.
(ν•˜μ§€λ§Œ λŒ“κΈ€ ν”Όλ“œλ°±λ„ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜ƒ )

μ΄λ²ˆμ— κ³ λ₯Έ 아티클은 Brandon Morelli λ‹˜μ΄ μž‘μ„±ν•˜μ‹  JavaScript Functions — Understanding The Basics 이닀. λ‚΄μš© 쀑간쀑간 πŸ€”이 μ•„μ΄μ½˜μ€ 본문에 λ‚˜μ™€ μžˆμ§€ μ•Šμ€ λ²ˆμ—­ ν•˜λ©° μΆ”κ°€ν•œ 말이닀. ν•¨μˆ˜ Invokingκ³Ό call의 ꡬ뢄을 두기 μœ„ν•΄μ„œ call은 호좜둜 λ²ˆμ—­ν•˜μ˜€κ³  invoking은 κ·ΈλŒ€λ‘œ 영문으둜 λ‘μ—ˆλ‹€. 

 

JavaScript Functions — Understanding The Basics

Explore Functions in JavaScript — declaration, expressions, invocation, and more.

codeburst.io


ν•¨μˆ˜λž€ 무엇인가?

  • ν•¨μˆ˜λŠ” νŠΉμ • μž„λ¬΄λ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ μ„œλΈŒ ν”„λ‘œκ·Έλž¨μ΄λ‹€.
  • ν•¨μˆ˜λŠ” 호좜(call)될 λ•Œ μ‹€ν–‰λœλ‹€. 이λ₯Ό ν•¨μˆ˜ invoking이라고 ν•œλ‹€.
  • 값은 ν•¨μˆ˜λ‘œ μ „λ‹¬λ˜μ–΄ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. 
  • ν•¨μˆ˜λŠ” 항상 값을 λ°˜ν™˜ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°˜ν™˜ 값이 λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄, ν•¨μˆ˜λŠ” undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. 
  • ν•¨μˆ˜λŠ” 객체이닀. 

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κΈ°.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” μ—¬λŸ¬ λ‹€λ₯Έ 방법듀이 μžˆλ‹€:

ν•¨μˆ˜ 선언식은 이름이 μžˆλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€. ν•¨μˆ˜ 선언식을 μž‘μ„±ν•˜λ €λ©΄ function ν‚€μ›Œλ“œ λ‹€μŒμ— ν•¨μˆ˜μ˜ 이름 μ‚¬μš©ν•œλ‹€. ν•¨μˆ˜ 선언식을 μ‚¬μš©ν•  λ•Œ, ν•¨μˆ˜ μ •μ˜λŠ” ν˜Έμ΄μŠ€νŒ…λ˜κ³ , κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜κ°€ μ •μ˜λ˜κΈ° 전에도 ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 

function name(parameters){
  statements
}

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 이름이 μžˆμ„ μˆ˜λ„ ν˜Ήμ€ 읡λͺ…μ˜ ν•¨μˆ˜μΌ μˆ˜λ„ μžˆλ‹€. 읡λͺ… ν•¨μˆ˜λŠ” 이름이 μ—†λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€. ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ…λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν•¨μˆ˜κ°€ μ •μ˜λ˜κΈ° 이전에 μ‚¬μš©ν•  수 μ—†λ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œμ—μ„œ 읡λͺ… ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€. 

let name = function(parameters){
  statements
}

ν™”μ‚΄ν‘œ ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μœ„ν•œ 더 짧은 ꡬ문이닀. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•΄λ‹Ή ν•¨μˆ˜ μžμ‹ μ˜ this 값을 μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.

let name = (parameters) => {
  statements
}

νŒŒλΌλ―Έν„° vs. 인자

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 처음이라면 μ•„λ§ˆλ„ νŒŒλΌλ―Έν„°μ™€ μΈμžκ°€ μ„œλ‘œ λ°”κΏ”μ„œ μ‚¬μš©λ˜λŠ” 것을 λ“€μ–΄λ³΄μ•˜μ„ 것이닀. λΉ„μŠ·ν•˜κΈ΄ ν•˜λ©΄μ„œλ„, 이 두 ν‚€μ›Œλ“œ μ‚¬μ΄μ—λŠ” μ€‘μš”ν•œ 차이가 μžˆλ‹€. 

νŒŒλΌλ―Έν„°λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©λœλ‹€. νŒŒλΌλ―Έν„°λŠ” ν•¨μˆ˜ μ •μ˜ 내뢀에 μƒμ„±λ˜λŠ” 이름이닀. 사싀 ν•¨μˆ˜ μ •μ˜ν•  λ•Œ, μ΅œλŒ€ 255개의 νŒŒλΌλ―Έν„°κΉŒμ§€ λ„˜κ²¨μ€„ 수 μžˆλ‹€! νŒŒλΌλ―Έν„°λŠ” κ΄„ν˜Έ() μ•ˆμ— 반점(콀마)으둜 κ΅¬λΆ„λœλ‹€. param1κ³Ό param2 두 νŒŒλΌλ―Έν„°μ— λŒ€ν•œ μ˜ˆμ œκ°€ μžˆλ‹€. 

const param1 = true;
const param2 = false;
function twoParams(param1, param2){
  console.log(param1, param2);
}

μΈμžλŠ” λ°˜λ©΄μ— ν•¨μˆ˜κ°€ 싀행될 λ•Œ (invoked) 각 νŒŒλΌλ―Έν„°λ‘œλΆ€ν„° ν•¨μˆ˜κ°€ λ°›λŠ” 값이닀. μœ„μ˜ μ˜ˆμ œμ—μ„œ 두 μΈμžλŠ” true와 false이닀. 

ν•¨μˆ˜λ₯Ό Invoking ν•˜κΈ°

ν•¨μˆ˜λŠ” 호좜되면 μ‹€ν–‰ν•œλ‹€. 이 과정이 invocation이닀. ν•¨μˆ˜ 이름을 μ–ΈκΈ‰ν•˜κ³  뒀에 κ΄„ν˜Έλ₯Ό μ—΄κ³  λ‹«μŒ:()으둜 invoke ν•  수 μžˆλ‹€. 

예제λ₯Ό μ‚΄νŽ΄λ³΄μž.

ꡬ글 크둬을 μ‚¬μš©ν•˜κ³  있자면 개발자 μ½˜μ†” 창을 μ—΄μ–΄μ„œ 같이 예제λ₯Ό μž‘μ„±ν•΄λ³Ό 수 μžˆλ‹€. [WINDOWS]: Ctrl + Shift + J [MAC]: Cmd + Opt + J

λ¨Όμ €, logItμ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€. 이 ν•¨μˆ˜λŠ” nameμ΄λΌλŠ” νŒŒλΌλ―Έν„°λ₯Ό ν•˜λ‚˜λ₯Ό λ°›λŠ”λ‹€. μ‹€ν–‰ μ‹œμ—, ν•¨μˆ˜λŠ” μ½˜μ†”μ— name을 좜λ ₯ν•  것이닀:

function logIt(name){
  console.log(name);
}

ν•¨μˆ˜λ₯Ό invoke ν•˜κΈ° μœ„ν•΄μ„œ 단일 νŒŒλΌλ―Έν„°λ₯Ό μ „λ‹¬ν•˜λ©΄μ„œ ν˜ΈμΆœν•œλ‹€. μ—¬κΈ° 이 ν•¨μˆ˜λ₯Ό name Joe둜 ν˜ΈμΆœν•˜κ³  μžˆλ‹€: 

logIt('Joe');
// Joe

ν•¨μˆ˜μ— νŒŒλΌλ―Έν„°κ°€ μ—†λ‹€λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 빈 κ΄„ν˜Έλ‘œ invoke ν•  수 μžˆλ‹€:

function logIt2(){
  console.log('The second one');
}

logIt2();
// The second one

ν•¨μˆ˜ λ°˜ν™˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“  ν•¨μˆ˜λŠ” λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. 

이 점에 λŒ€ν•΄ 빈 ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜κ³  invoking ν•˜μ—¬ ν…ŒμŠ€νŠΈν•΄λ³΄μž:

function test(){};

test();
// undefined

멋지닀, μ˜ˆμƒν–ˆλ“―μ΄ undefinedκ°€ λ°˜ν™˜λ˜μ—ˆλ‹€. 

이제, μ‚¬μš©μžκ°€ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜ν•˜κ³ μž ν•˜λŠ” 것을 return ν‚€μ›Œλ“œ 뒀에 λ°˜ν™˜ν•  κ°’κ³Ό ν•¨κ»˜ λ°˜ν™˜ν•  수 μžˆλ‹€. μ•„λž˜μ˜ μ½”λ“œλ₯Ό 보자:

function test(){
  return true;
};

test();
// true

이 μ˜ˆμ œμ—μ„œ λͺ…μ‹œμ μœΌλ‘œ ν•¨μˆ˜μ—κ²Œ trueλ₯Ό λ°˜ν™˜ν•  것을 μ•Œλ €μ€€λ‹€. ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό invoke ν•˜λ©΄ λ°”λ‘œ trueκ°€ λ°˜ν™˜λœλ‹€. 

그런데 μ™œ 이 점이 μ€‘μš”ν• κΉŒ?

μ™œλƒν•˜λ©΄ ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λŠ” 값이 사싀 κ·Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 곳으둜 λ°˜ν™˜ν•˜λŠ” 것이기 λ•Œλ¬Έμ— μ€‘μš”ν•˜λ‹€. 이 μ½”λ“œλ₯Ό 보자: 

let double = function(num) {
   return num * 2;
}

이 ν•¨μˆ˜ ν‘œν˜„μ‹μ€ num νŒŒλΌλ―Έν„°μ˜ 값을 두 배둜 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•œ 것이닀. ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό invoke ν•˜κ³  λ°˜ν™˜ 값을 λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆλ‹€: 

let test = double(3);

μš°λ¦¬κ°€ test 값을 좜λ ₯해보면 6을 확인할 수 μžˆλ‹€:

console.log(test);
// 6

멋지닀! return은 ν•¨μˆ˜μ—μ„œ 값을 λ°˜ν™˜ν•  뿐 μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 무엇이든 그것에 κ°’을 ν• λ‹Ήν•œλ‹€.


return 문의 λ‹€λ₯Έ μ€‘μš”ν•œ κ·œμΉ™μ€ ν•¨μˆ˜μ˜ 싀행을 μ¦‰μ‹œ μ€‘λ‹¨ν•œλ‹€λŠ” 것이닀.

두 개의 return문이 μžˆλŠ” test ν•¨μˆ˜μ— λŒ€ν•œ 예제λ₯Ό κ³ λ €ν•΄λ³΄μž:

function test(){
  return true;
  return false;
};
test();
// true

 μ²˜μŒ return 문은 ν•¨μˆ˜ 싀행을 즉각 μ€‘λ‹¨ν•˜κ³  ν•¨μˆ˜κ°€ trueλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•œλ‹€. μ„Έ 번째 쀄에: return false;λŠ” μ ˆλŒ€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

ν•¨μˆ˜ 객체

ν•¨μˆ˜λŠ” ν•¨μˆ˜ 객체이닀. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λ³Έν˜•(undefined, null, boolean, number, string)이 μ•„λ‹Œ 것은 무엇이든 객체이닀. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°μ²΄λŠ” 맀우 λ‹€μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 이 λ•Œλ¬Έμ—, μš°λ¦¬λŠ” ν•¨μˆ˜μ— λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κ²¨μ€„ μˆ˜λ„ μžˆλ‹€. 

ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ 받을 λ•Œλ‚˜ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•  λ•Œ, κ³ μ°¨ ν•¨μˆ˜(higher-order function)μ΄λΌλŠ” 것을 ν˜ΈμΆœν•œλ‹€. μ•„λ§ˆλ„ 이미 λ§Žμ€ κ³ μ°¨ ν•¨μˆ˜λ₯Ό 심지어 무엇인지도 λͺ¨λ₯Έ 채 μ‚¬μš©ν•΄ λ³΄μ•˜μ„ 것이닀: Array.prototype.map, Array.prototype.filterκ°€ κ³ μ°¨ ν•¨μˆ˜μ΄λ‹€.(λͺ‡ 개만 μ–ΈκΈ‰ν•œ 것이닀.) 이전에 써둔 아티클듀을 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체와 κ³ μ°¨ ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³Ό 수 μžˆλ‹€. 

μ£Όμš”μ 

μ†Œν™”ν•  λ‚΄μš©λ“€μ΄ λ§Žλ‹€. μ—¬κΈ° μ€‘μš”ν•œ 것듀에 λŒ€ν•œ λͺ©λ‘μ„ 적어뒀닀. 

  • ν•¨μˆ˜λŠ” νŠΉμ • μž„λ¬΄λ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ μ„œλΈŒ ν”„λ‘œκ·Έλž¨μ΄λ‹€.
  • ν•¨μˆ˜ 선언식은 ν˜Έμ΄μŠ€νŒ…λœλ‹€ - ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 그렇지 μ•Šλ‹€.
  • ν•¨μˆ˜λŠ” 호좜(call)될 λ•Œ μ‹€ν–‰λœλ‹€. 이λ₯Ό ν•¨μˆ˜ invoking이라고 ν•œλ‹€.
  • 값은 ν•¨μˆ˜λ‘œ 전달될 수 있으며 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ  수 μžˆλ‹€. κ·Έ κ°’μ˜ 이름은 νŒŒλΌλ―Έν„°μ΄κ³ , μ‹€μ œ 값은 인자라고 λΆ€λ₯Έλ‹€. 
  • ν•¨μˆ˜λŠ” 항상 값을 λ°˜ν™˜ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ return 값이 λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ ν•¨μˆ˜λŠ” 기본적으둜 undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. 
  • ν•¨μˆ˜λŠ” 객체이닀.