함수 선언문(Declaration)
function hello() {}
함수 표현식(Expression)
const hello = function () {};
function hello() {
console.log("hello");
}
hello();
hello();
function hello() {
console.log("hello");
}
const world = function hello() {
console.log("Hello");
};
return
: 반환할 데이터를 제공하고 함수를 종료 → return 이후의 코드는 실행되지 않음 → 반환할 데이터가 없는 경우 undefined 반환 return;
function hello() {
return "Hello!";
console.log("Wow");
}
console.log(hello()); // Hello!
ex)
function plus(num) {
if (num === undefined) {
// num이 undefined면 return
console.log("숫자를 입력해주세요!");
return 0;
}
return num + 1;
}
console.log(plus(2));
console.log(plus(7));
console.log(plus()); // undefined+1 = NaN
// 매개변수
// b에 기본 값 지정(인수로 받아온 값이 없는 경우 대신 사용)
function sum(a, b = 1) {
return a + b;
}
console.log(sum(1, 2)); // 인수(argument)
console.log(sum(7));
매개변수 객체 구조 분해 할당
객체 문법 이용
const user = {
name: "HEROPY",
age: 85,
};
function getName(user) {
return user.name; // 혹은 user.name;
}
console.log(getName(user));
구조 분해 할당(1)
const user = {
name: "HEROPY",
age: 85,
};
function getName(user) {
const { name } = user;
return name;
}
console.log(getName(user));
구조 분해 할당(2)
const user = {
name: "HEROPY",
age: 85,
};
function getName({ name }) {
return name;
}
console.log(getName(user));
const user = {
name: "HEROPY",
age: 85,
};
// 이메일 속성이 없는 경우를 대비하여 기본값 설정
function getEmail({ email = "이메일이 없습니다." }) {
return user.email;
}
console.log(getEmail(user));
매개변수 배열 구조 분해할당
배열 인덱스 이용
const fruits = ["Apple", "Banana", "Cherry"];
function getSecondItem(array) {
return array[1];
}
console.log(getSecondItem(fruits));
배열 구조 분해 할당 → 쉼표로 구분
const numbers = [1, 2, 3, 4, 5, 6, 7];
function getSecondItem([, b]) {
return b;
}
console.log(getSecondItem(numbers));
function sum(...rest) {
console.log(rest);
return rest.reduce((acc, current) => {
return acc + current;
}, 0);
}
console.log(sum(1, 2)); // 3
console.log(sum(1, 2, 3, 4)); // 10
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); // 55
💡 함수 표현 방식
- 함수 선언:
function sum() {};
- 함수 표현:
const sum = function () {};
- 화살표 함수(일종의 함수 표현식):
const sum = () => {};
function sum(a, b) {
return a + b;
}
const sum = (a, b) => a + b;
const a = () => {};
const b = (x) => {};
const b = x => {};
const c = (x, y) => {};
const d = (x) => {
return x * x;
};
return
과 중괄호 생략 가능const e = (x) => x * x;
const f = (x) => {
console.log(x);
return x * x;
};
const g = () => {
return { a: 1 };
};
const h = () => ({ a: 1 });
const i = () => {
return [1, 2, 3];
};
const j = () => [1, 2, 3];
(()=>{
console.log(a*2);
})();
(F)()
→ (() => {})();
(F)()
→ (function () {})();
(F())
→ (function () {}());
!F()
→ !(function () {})();
+F()
→ +(function () {})();
((a,b)=>{console.log(a); console.log(b)})(1,2);
const a = (callback) => {
console.log("A");
callback();
};
const b = () => {
console.log("B");
};
a(b);
// A
// B
ex) setTimeout()
사용
const sum = (a, b, c) => {
setTimeout(() => {
c(a + b);
}, 1000);
};
sum(1, 2, (value) => {
console.log(value);
});
ex) 이미지 업로드
const loadImage = (url, cb) => {
const imgEl = document.createElement("img");
imgEl.src = url;
imgEl.addEventListener("load", () => {
cb(imgEl);
});
};
const containerEl = document.querySelector(".container");
loadImage("https://picsum.photos/200", (imgEl) => {
containerEl.innerHTML = "";
containerEl.append(imgEl);
});
→ 무한으로 반복하며 특정 조건 찾을 수 있음
❗️무한으로 반복되기 때문에 종료 조건이 필요하다.
const a = () => {
console.log("A");
a(); // 무한호출
};
a();
[종료조건 추가]
let i = 0;
const b = () => {
console.log("A");
i += 1;
// i가 자신보다 작을 때만 재귀함수 호출
if (i < 4) {
b();
}
};
b();
ex) 최상위 부모 찾기
const userA = { name: "A", parent: null };
const userB = { name: "B", parent: userA };
const userC = { name: "C", parent: userB };
const userD = { name: "D", parent: userC };
const getRootUser = (user) => {
// parent가 있으면 해당 user의 부모를 다시 인자로 넘겨줌
if (user.parent) {
return getRootUser(user.parent);
}
return user;
};
console.log(getRootUser(userD)); // { name: 'A', parent: null}
setTimeout(F(), 시간);
: 해당 시간 후에 함수 실행
const hello = () => {
console.log("Hello~!");
};
setTimeout(hello, 2000); // 2초 후 실행
const timeout = setTimeout(hello, 2000);
const h1El = document.querySelector("h1");
h1El.addEventListener("click", () => {
// h1을 클릭하면 타이머 취소
clearTimeout(timeout);
});
setInterval(F(), 시간);
: 해당 시간마다 함수 실행
const timeout2 = setInterval(hello, 2000); // 2초마다 실행
h1El.addEventListener("click", () => {
// h1을 클릭하면 타이머 취소
clearInterval(timeout);
});
호출 위치에서 정의
const user = {
firstName: "Heropy",
lastName: "Park",
age: 85,
getFullName: function () {
// 현재 getFullName이 들어있는 객체 데이터 참조
return `${this.firstName} ${this.lastName}`;
},
};
console.log(user.getFullName());
→ 어떤 객체가 가지고 있는 메서드를 다른 객체에서 가져다 사용 가능
const user4 = {
firstName: "Heropy",
lastName: "Park",
age: 85,
getFullName() {
return `${this.firstName} ${this.lastName}`; // Lewis Yang
},
};
const lewis = {
firstName: "Lewis",
lastName: "Yang",
};
console.log(u.getFullName.call(lewis)); // u의 getFullName메소드 빌려서 실행
자신이 선언한 함수(렉시컬) 범위에서의 정의
💡 렉시컬(Lexical): 함수가 동작할 수 있는 유효한 범위
const user2 = {
firstName: "Heropy",
lastName: "Park",
age: 85,
getFullName: () => {
// 화살표 함수 범위 밖의 데이터는 참조 불가능
return `${this.firstName} ${this.lastName}`; // undefined undefined
},
};
console.log(user2.getFullName());
function user3() {
this.firstName = "Neo";
this.lastName = "Anderson";
return {
firstName: "Heropy",
lastName: "Park",
age: 85,
getFullName: () => {
//자신을 호출 하고 있는 함수 범위를 참조(밖)
return `${this.firstName} ${this.lastName}`; // Neo Anderson
},
};
}
const u = user3();
console.log(u.getFullName());