* 아래 내용은 DreamCoding과 MDN 자료를 정리한 내용입니다.
function printHello(){} // 함수 선언
const print = function printHello() {} // 함수 표현
first-class function을 지원한다.
: 함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있다.
→ 함수를 다른 변수와 동일하게 다루는 언어는 first-class function을 가졌다고 표현한다.
함수의 이름을 전달한다는 것은 함수가 가리키는 reference을 복사해서 전달하는 것이다. → 💥Function is object in JS !
프로그램에서 function은 fundamental building block이다.
"sub program"이라고도 불리며 여러 번 재사용 가능
한 가지 task를 수행하거나, 어떤 값을 계산하는 데 사용
function fuction_name(param1, param2){body... return;}
naming: doSomething, command, verb
하나의 함수는 한 가지 일을 해야 한다.
e.g. createCardAndPoint → creatCard, createPoint
function is object in JS
→ 콘솔에서 선언된 함수에 '.'을 찍으면 그 함수의 속성값들이 뜨는 걸 볼 수 있음
function printHello() {
console.log("Hello");
}
printHello(); // 별로 쓸모 없음
function log(message) {
console.log(message);
}
log("Hi, I'm merry!");
// 파라미터를 받아서 출력해야 쓸모가 있다.
하지만, js에서는 타입이 없어서 함수자체의 인터페이스만 보면 이 메시지가 string을 전달해야하는지 number를 전달해야하는지 알 수 없다.
→ 타입이 중요한 함수에서는 자바스크립트는 조금 난해할 수 있다.
❗ 참고 ) TypeScript
타입스크립트는 항상 파라미터나 리턴의 타입을 명시하도록 되어있어서, 함수의 인터페이스만 봐도 얘가 정확하게 무엇을 하는 함수인지(함수의 이름, 전달되어야되는 파라미터와 그의 데이터타입, 어떤 값이 리턴되어야 하는지) 확실하게 확인하고 쓸 수 있다.
function changeName(obj) {
obj.name = "bob";
}
const merry = { name: "merry" };
changeName(merry);
console.log(merry); // {name: "bob"}
▷ 오브젝트는 레퍼런스로 전달되기 때문에 함수 안에서 오브젝트의 값을 변경하게 되면 그 변경된 사항이 그대로 메모리에 적용된다.
(added in ES6)
: 원하는 default 값을 지정할 수 있다. 사용자가 인자를 전달하지 않았거나 undefined을 전달할 경우 이 값이 대체 되어져 사용된다.
예제 )
function showMessage(message, from = "unknown") {
console.log(`${message} by ${from}`);
}
showMessage("Hi!"); // Hi! by unknown
▷ message에는 "Hi"를 전달했지만 from에는 받은 인자가 없어서
"unknown"으로 대체되어져 사용된다.
→ default parameter를 지정하지 않았을 경우 from은 undefined로 출력된다.
아래는 위의 코드와 의미가 같다.
function showMessage(message,from){
if(from===undefined){
from='unknown';
}
console.log(`${message} by ${from}`);
}
(added in ES6)
function funcName(...parameterName){
statements...
}
'...'을 쓰면 인자를 배열형태로 받는다.
예제 )
function printAll(...args) {
for (let i = 0; i < args.length; i++) {
console.log(args[i]);
}
printAll("dream", "coding", "ellie");
[console]
dream
coding
ellie
위의 for loop 대신에 for of문과 forEach()를 사용해도 같다.
// for of문
for (const arg of args) {
console.log(arg);
}
// forEach()
args.forEach((arg) => console.log(arg));
JS에서 scope란?
" 밖에서는 안이 보이지 않고 안에서만 밖을 볼 수 있다. "
let globalMessage = "global"; //global variable
function printMessage() {
let message = "hello";
console.log(message); //local variable
console.log(globalMessage);
function printAnother() {
console.log(message);
let childMessage = "hello";
}
console.log(childMessage); // error
}
printMessage();
console.log(message); // error
return 명령문은 함수 실행을 종료하고, 주어진 값을 함수 호출 지점으로 반환한다.
function sum(a, b) {
return a + b;
}
const result = sum(1, 2); //3
❗ return 값을 명시하지 않거나, return 자체를 생략하면 undefined
을 반환한다.
// Bad👎👎
function upgradeUser(user) {
if (user.point > 10) {
// long upgrade logic...
}
}
/* 이렇게 '~~일 때 ~~한다' 라고 작성하게 되면
(블럭 안에서 코드를 많이 작성하면) 가독성이 떨어짐 */
// Goooood👍👍
function upgradeUser(user) {
if (user.point <= 10) {
return;
}
// long upgrade logic...
}
/* 조건이 맞지 않는 경우 가능한 빨리 리턴 해서 함수를 종료시키고,
조건이 맞을 때만 쭉 실행하는 것이 중요 */
: Immediately Invoked Function Expression
function hello(){
console.log('IIFE');
}
hello();
이렇게 선언과 동시에 호출하려면, 아래처럼 괄호를 묶어주면 된다.
(function hello() {
console.log("IIFE");
})();
함수 선언과 비슷하고 구문이 같다.
함수 표현식은 선언이 되지 않은 상태에서 사용할 수 없기 때문에 함수를 사용하기 전에 코드에 함수코드가 존재해야 사용할 수 있다.
(반면에 함수 선언식은 선언이 hoisting 되기 때문에 선언되기 전에 사용이 가능하다.)
const myFunction = function() {
statements..
}
const myFunction = function namedFunction(){
statements..
}
unsing function expression
콜백 함수는 인수로서 다른 함수로 전달되는 함수로, 그 다음 외부 함수 내에서 호출되어 어떤 종류의 루틴이나 행동을 완료한다.
예제 )
printYes와 printNo가 callback functions로서 파라미터로 전달되어짐
function randomQuiz(answer, printYes, printNo) {
if (answer === "love you") {
printYes();
} else {
printNo();
}
}
const printYes = function () {
//anonymous function
console.log("yes!");
};
const printNo = function print() {
console.log("no!");
};
randomQuiz("wrong", printYes, printNo); // no!
randomQuiz("love you", printYes, printNo); // yes!
: 자기 자신을 호출하는 함수를 말한다.
예제 )
제공된 정수의 팩토리얼을 반환
function factorial(x) {
if (x<0) return;
if (x===0) return 1;
return x * factorial(x-1);
}
factorial(3);
// 6
피보나치 수열, 팩토리얼 또는 반복적인 평균을 계산시 등.. 꼭 필요할 때에만 사용해야한다. 잘못 사용시 프로그램이 죽을 수 있다.
(always anonymous!)
ES6에 도입이 되어진 함수이다.
/* [도입 전]
const simplePrint = function () {
console.log("simplePrint!");} */
const simplePrint = () => console.log("simplePrint!");
/* [도입 전]
const add=function(a,b){
return a+b;} */
const add = (a, b) => a + b;
const simpleMultiply = (a, b) => {
// do somthing more...
return a + b;
};
/* 이렇게 함수안에서 다양한 일들을 해야할 땐
블럭을 써주고 안에 return을 꼭 적어줘야함 */
❗ 참고자료
https://developer.mozilla.org/ko/docs/Glossary/First-class_Function
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions
https://www.youtube.com/channel/UC_4u-bXaba7yrRz_6x6kb_w