함수는 자바스크립트에서 가장 중요한 핵심 개념이며, 또 다른 중요한 핵심 개념들( 스코프, 실행 컨텍스트, 클로저, 생성자 함수에 의한 객체 생성, 메서드, this, 프로토타입, 모듈화 등)과 깊은 관련이 있다.
function name(param1, param2) { body ... return; }
🔸 하나의 함수는 한가지의 일만 하도록 만들어야 한다 🔸
원시 타입은 값 value 을 복사하고,( 깊은 복사 )
참조 타입은 주소 refernce 를 복사한다. ( 얕은 복사 )
function showMessage(message, from) {
console.log(`${message} by ${from}`);
}
showMessage('Hi!'); // Hi! by undefined
// from 이 정의 되어있지 않기 때문에 undefined로 출력
function showMessage(message, from = 'unknown') {
console.log(`${message} by ${from}`);
}
showMessage('Hi!'); // Hi! by unknown
// 매개변수 옆에 원하는 default 값을 지정해 놓으면 사용자가 매개변수를 지정하지 않을때
// 값이 대체 되어서 출력된다
" ... "을 사용하고 배열 형태로 전달된다.
function printAll(...args) {
for (let i = 0; i < args.length; i++) {
console.log(args[i]); // 방법 ①
}
// for (const arg of args) {
// console.log(arg); 방법 ②
// }
// args.foreach((arg) => console.log(arg)); 방법 ③
}
printAll('Eunji', 'Amy', 'Coding'); // Eunji, Amy, Coding
함수가 완료되었을 때 함수가 반환하는 값.
- 반환문은 함수 몸체 내부에서만 사용할수 있다.
- return 키워드와 반환값 사이에 줄바꿈이 있으면 무시된다. ( 세미콜론 ; 삽입 금지 )
function upgradeUser(user) {
if (user.point > 10) {
// logic...
}
} // Bad😱 - 블록 안에서 로직을 많이 작성 ( if/ else) 하면 가독성이 떨어진다.
function upgradeUser(user) {
if (user.point > 10) {
return; // 조건이 맞지 않는다면 return으로 빨리 함수를 종료하고
} // 조건이 맞을때만 필요한 logic을 실행하는게 좋다.
// logic...
} // Good😁
const print = function () { // 익명 함수(anonymous function)
console.log('print');
};
print(); // 함수 호출 -> print 출력
const printAgain = print; // printAgain은 위에 선언된 함수를 가리키고 있으므로
printAgain(); // 함수 호출을 하면 -> print 가 출력된다.
선언문 과 표현식의 가장 큰 차이점은
- 선언문은 호이스팅이 가능함.( 함수가 선언되기 이전에 호출 가능)
- 선언문은 함수 이름을 생략할수 없다.
- 선언문은 표현식이 아닌 문( Statement ) 이다.
✏️ ✏️ ✏️- 표현식은 할당된 다음부터 호출이 가능하다.
- 표현식은 표현식이 문( statement ) 이다.
function randomQuiz(answer, printYes, printNo) {
if (answer === 'love u') {
printYes();
} else {
printNo();
}
}
const printYes = function () { // 익명 함수
console.log('Yes!');
};
// 표현식에서 이름을 쓰는 이유는 디버깅을 할때 스택 추적에 함수 이름이 나오게 하려고 사용
// 또는 함수 안에서 자신 스스로 또다른 함수를 호출할때 (재귀 함수) 이다.
const printNo = function print() { // 기명 함수
console.log('No!');
}
randomQuiz('wrong', printYes, printNo); // No!
randomQuiz('love u', printYes, printNo); // Yes!
화살표 함수는 익명 함수 이다.
- 블록형 보다 훨씬 간결하게 사용 할수 있다.
const simplePrint = function () { console.log('simplePrint!'); }; 🔻 🔻 🔻 ⭐️ const simplePrint = () => console.log('simplePrint!'); ⭐️
함수를 선언함과 동시에 즉시 호출되는 함수 이다.
- 즉시 실행 함수는 반드시 괄호 ()로 선언을 감싸야 한다.
(function hello() { console.log('IIFE'); })(); // IIFE
자기 자신을 호출하는 행위, 즉 재귀 호출을 하는 함수 이다.
- 함수 몸체 내부에서는 함수 이름을 이용해 자기 자신을 호출할 수 있지만, 함수 외부에서는 반드시 함수를 가리키는 식별자로 호출해야 한다.