๐ ๋๋ฆผ์ฝ๋ฉ by ์๋ฆฌ JavaScript ์ ๋ฆฌ 4. ํจ์์ ์ ์ธ๊ณผ ํํ
Function
- ํ๋ก๊ทธ๋จ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์
- ์ฌ๋ฌ๋ฒ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
- ์์ ์ ์ํํ๊ฑฐ๋ ๊ฐ์ ๊ณ์ฐ
ํจ์๋ ์ ๋ ฅ -> ์ฐ์ฐ -> ์ถ๋ ฅ ์ ๊ณผ์ ์ ๊ฐ์ง๊ณ ์๋ค.
ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ๊ฐ์ function๋ค๋ก ๊ตฌ์ฑ๋์ด์๊ณ function ํ๋ํ๋๋ฅผ sub program์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
1. ํจ์ ์ ์ธ
function ์ด๋ฆ (ํ๋ผ๋ฏธํฐ) {
body...
return;
}
ํ๋์ ํจ์๋ ํ๋์ ์ด๋ฆ๋ง ํ์ฉํ๊ณ ๋์ฌ ํํ๋ก ์ด๋ฆ์ ์ง์ ํ๋ค.
js์์ ํจ์๋ object์ด๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ๋ณ์์ ํ ๋นํ ์๋ ์๊ณ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋์ด ํจ์๋ฅผ return ํ ์๋ ์๋ค.
2. ํ๋ผ๋ฏธํฐ (๋งค๊ฐ ๋ณ์)
- ๊ฐ์ผ๋ก ์ ๋ฌ (primitive parameters)
function changeName(obj) {
obj.name = "coder";
}
- ์ฐธ์กฐ๋ก ์ ๋ฌ (object parameters)
const ellie = { name: "ellie" };
changeName(ellie);
console.log(ellie);
3. Default parameters
ES6์์ ์ถ๊ฐ๋ ๊ฒ์ผ๋ก ํ๋ผ๋ฏธํฐ์ ๊ธฐ๋ณธ ๊ฐ์ ์ง์ ํด์ค๋ค.
function showMessage(msg, from = "unknown") {
console.log(`${msg} by ${from}`);
}
showMessage("hi!");
๋ง์ฝ์ ๊ธฐ๋ณธ ๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฉด
function showMessage(msg, from) {
console.log(`${msg} by ${from}`);
}
showMessage("hi!");
undefined๊ฐ ๋์ค๊ฒ ๋๋ค.
4. rest parameters
๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ ๋ ์ ์ฉํ๋ค.
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("dream", "coding", "ellie"); // > dream coding ellie ์์๋๋ก ์ถ๋ ฅ
5. Local scope
๋ฐ์์๋ ์์ด ๋ณด์ด์ง ์๊ณ ์์์๋ง ๋ฐ์ ๋ณผ ์ ์๋ค..!!!
let globalMessage = "global"; // global ๋ณ์
function printMessage() {
let message = "hello"; // local ๋ณ์
console.log(message);
console.log(globalMessage);
function printAnother() {
console.log(message); // ์์ํจ์๊ฐ ๋ถ๋ชจํจ์์ ์ ์๋ message ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ -> ํด๋ก์
let childMessage = "hello";
}
}
printMessage();
6. return a value
function sum(a, b) {
return a + b;
}
const result = sum(1, 2);
console.log(result);
// ๊ทผ๋ฐ ๋ง์ฝ function ์ return์ด ์๋ค๋ฉด ์์์ return undefined๊ฐ ๋๋ค.
// ์ถ๊ฐ) early return , early exit (์กฐ๊ธฐ ๋ฆฌํด, ์กฐ๊ธฐ ์ข
๋ฃ)
// function ์์์ ๊ฐ๋
์ฑ์๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ์กฐ๊ฑด์ ์๋ง์ ๋ ๋ฐ๋ก๋ฐ๋ก return ๋๋๋ก ํ๋๊ฒ์ด ์ข๋ค.
//bad
function upgradeUser(user) {
if (user.point > 10) {
// ...
} else {
return;
}
}
//good
function upgradeUser(user) {
if (user.point <= 10) {
return;
} else {
// ...
}
}
First-class function
1. function expression
// print(); > ์ ์ธ ์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฐ์.
const print = function () {
// ๋ณ์์ ํจ์ ํ ๋น
console.log("print!");
};
print(); // > print!
const print2 = print;
print2(); // > print!
function sum(a, b) {
return a + b;
}
const sum2 = sum; //์ด๋ฏธ ์ ์ธํ ํจ์๋ฅผ ๋ณ์์ ๋ค์ ํ ๋น ๊ฐ๋ฅ
console.log(sum2(1, 2)); // > 3
2. ํจ์ ํํ์์ ์ฌ์ฉํ callback ํจ์
function randomQuiz(answer, printYes, printNo) {
if (answer === "love you") {
printYes();
} else {
printNo();
}
}
// ์ต๋ช
ํจ์
const printYes = function () {
console.log("yes!!");
};
// named function
const printNo = function print() {
console.log("no~~");
};
randomQuiz("wrong", printYes, printNo); // ํ์ํ ๋ ๋์ ๋ง์ถฐ ํจ์๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํด๋ผ..!! ๋ญ ๊ทธ๋ฐ!
randomQuiz("love you", printYes, printNo);
3. ํ์ดํ ํจ์
- ํญ์ ์ต๋ช ํจ์์ด๋ค
- ํจ์๋ฅผ ๊ฐ๋จํ๊ฒ ๋ง๋ ๋ค.
- ๋ฐฐ์ด/๋ฆฌ์คํธ์ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
const simplePrint = () => console.log("simple~");
const add = (a, b) => a + b;
const simpleMultiply = (a, b) => {
return a * b;
};