1. ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ๋น๋ฉ ๋ธ๋ญ
2. ์๋ธ ํ๋ก๊ทธ๋จ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
3. ์ฌ๋ฌ๋ฒ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
4. ํ๊ฐ์ง์ ์
๋ฌด๋, ๊ฐ์ ๊ณ์ฐํ ๋ ์ฌ์ฉ๋๋ค.
function add(x, y) { //add๋ผ๋ ์ด๋ฆ์ ๊ฐ๋ ํจ์ ์ง์ , (x, y)๋ ๋งค๊ฐ๋ณ์(parameter)
const result = x + y;
return result; //๋ฐํ๊ฐ(return value)
} //ํจ์ ์ ์ ๋
add(2, 3); // ์ ์ํ ํจ์ ๋ค์ ()๋ฅผ ๋ถ์ฌ์ ํธ์ถ(function call), ()์์ 2, 3์ ์ธ์(argument)
ํ๋์ ํจ์๋ ํ๊ฐ์ง ๋์๋ง ํด์ผ ํ๋ค.
( ex : createCardAndPoint โ createCard / ceatePoint ๋ก ๊ตฌ๋ถ)
ํจ์์ ์ด๋ฆ์ command, verb ํํ๋ก ์ง์ ํด์ผ ํ๋ค.
( ex : doSomething, printHello )
JS์์ ํจ์๋ object์ด๋ค!
๋ ์ ํํ๋, first class object (1๊ธ ๊ฐ์ฒด)์ด๋ค!
function์ ๋ค๋ฅธ ๋ณ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ณ์ ์์ ํ ๋นํ ์ ์๊ณ , parameter๋ก ์ ๋ฌ๋ ๋๊ณ , ํจ์๋ฅผ returnํ ์๋ ์๋ค!
๋ํ, function์ first class function (1๊ธ ํจ์)๋ผ๊ณ ๋ ํ๋๋ฐ, ๋ค์๋งํด JavaScript์ function์ 1๊ธ ๊ฐ์ฒด์ 1๊ธ ํจ์๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ค. (๋ณดํต 1๊ธ ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
1๊ธ ์๋ฏผ, ๊ฐ์ฒด, ํจ์ ์๊ธฐ๋ ์ฐพ์๋ณด๋ ์ข ์ฌ๋ฏธ์์ด์ ๋ฐ๋ก ์ ๋ฆฌํด์ ์ฌ๋ฆด ์์ ! ๊ทธ๋ฌ๋ 1๊ธ ๊ฐ์ฒด,ํจ์ ์๊ธฐ๋ ์ฌ๊ธฐ๊น์ง!
JS์์๋ type์ด ์ง์ ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์, ํจ์ ์ธํฐํ์ด์ค๋ง ๋ณด๋ฉด ์ด message๊ฐ string์ ์ ๋ฌํ๋์ง, number๋ฅผ ์ ๋ฌํ๋์ง ๋ช
ํํ์ง ์๋ค...๐
๐ปโโ๏ธ
โ type์ ๋ช
ํํ ํด์ผํ๋ ๊ฒฝ์ฐ ์ถํ์ ๋ฐฐ์ฐ๊ฒ ๋ TypeScript์์ type์ ๋ช
ํํ ์ง์ ํ ์ ์๋ค.
โ ๋ง๋ณด๊ธฐ๋ก ์ด ์ฌ์ดํธ์์ TypeScript๋ก ์ฝ๋๋ฅผ ์
๋ ฅํด๋ณผ ์ ์๊ณ , ์
๋ ฅํ ์ฝ๋๋ฅผ JavaScript๋ก ๋ณํํด์ ๋ฐ๋ก ๋ณผ ์ ์๋ค!
return ํค์๋(์๋ 3๋ฒ์ ์ ๋ฆฌ)๊ฐ ํจ์๋ฅผ ํธ์ถํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ด๋ผ๋ฉด,
parameter์ argument๋ ํจ์๊ฐ ์คํ๋ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ฐฉ๋ฒ!
function getName(name) {
return name + '๋';
}
const result1 = getName('๊ฐ๋ฐ์'); // ๊ฐ๋ฐ์๋
const result2 = getName('๋์์ด๋'); // ๋์์ด๋๋
const result3 = getName('๊ธฐํ์'); // ๊ธฐํ์๋
์ด ๋, ํจ์ ๋ด๋ถ์์ ์ธ์๋ก ๋ฐ์ ๋ณ์์ ์๋ก์ด ๊ฐ์ ๋ฃ์ผ๋ฉด ์๋๋ค!
function getName(name) {
let name = "solmi";
return name + '๋';
}
getName("solmi"); // error
์ธ์(parameter)์ ์ค์ ๋ก ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋ ์ง๋ ํธ์ถํ ๋ ๊ฒฐ์ ํ๋ฏ๋ก, ์์ ๊ฐ์ด ํจ์ ๋ด๋ถ์์ ์ธ์๋ก ๋ฐ์ ๋ณ์(name)์ ์๋ก์ด ๊ฐ("wecode")์ ๋ฃ์ผ๋ฉด ์๋ฌ๊ฐ ๋จ๊ฒ ๋๋ค.
function changeName(obj) {
obj.name = "coder";
}
const solmi = {name: "solmi"};
changeName(solmi);
console.log(solmi); // {name : "coder"} ๊ฐ ์ถ๋ ฅ๋๋ค.
object type์ ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ obj ์์ ์๋ name์ ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋ค.
=>premitive type parameters์ด๋ object type parameters์ด ์ ํํ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค.... ๋ ๊ณต๋ถํด์ ์ถ๊ฐํ๊ฒ ์
function reassign(x) {
x = 2;
return x;
}
const y = 1;
const result = reassign(y); //์ด๋ฏธ ์ง์ ๋ ํจ์์ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์๋ก์ด ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํด๋
console.log(y); // 1 ์ถ๋ ฅ
console.log(result); // 2 ์ถ๋ ฅ => ๊ฒฐ๊ณผ๊ฐ์ ๋จผ์ ์ ์๋ ํจ์์ธ reassign(x)๋ก ์ถ๋ ฅ๋๋ค.
ํ๋ผ๋ฏธํฐ๋ ๋ฐ๊นฅ์์ ์ ์ธ๋ ๋ณ์์๋ ๊ด๊ณ์๋ ๋ ๋ฆฝ์ ์ธ ๋ณ์!
function showMessage(message, from) {
if (from === undefined) {
from = "unknown";
}
console.log(`${message} by ${from};
}
showMessage("hi!"); //hi! by unknown ์ถ๋ ฅ
Default parameter๊ฐ ์๊ธฐ๊ธฐ ์ ์๋, message๋ง ์ง์ ํ๊ณ from์ ์ง์ ํ์ง ์์์๋๋ฅผ ๋๋นํด์ if
ํจ์๋ก ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๊ฐํด์คฌ์ด์ผ ํ๋๋ฐ,
function showMessage(message, from = "unknown") {
console.log(`${message} by ${from};
}
showMessage("hi!"); //hi! by unknown ์ถ๋ ฅ
ES6๋ถํฐ๋, ํ๋ผ๋ฏธํฐ ์์ =
์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํด ๋์ผ๋ฉด, ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ์ง ์์ ๋, ๊ธฐ๋ณธ๊ฐ์ด ์๋์ผ๋ก ์ถ๋ ฅ๋๋ค.
function printAll(...args) { //AA, BB, CC๊ฐ ๋ด๊ฒจ์๋ ๋ฐฐ์ด์ด ๋๋ค.
for (let i = 0; i < args.length; i++) {
console.log(args[i]);
}
}
printAll("AA", "BB", "CC"); //AA, BB, CC๊ฐ ๊ฐ๊ฐ ์ถ๋ ฅ๋๋ค.
...
์ ์ฌ์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐฐ์ด ํํ๋ก ์ ๋ฌํ๋ค.
์ ์์์์ ์ฌ์ฉํ printAll ํจ์ ๊ฐ๋จํ๊ฒ ์ฐ๊ธฐ!
์์์๋(...args)
๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด for....i < args....i++....๋ฅผ ์ด์ฉํด ๋ณต์กํ๊ฒ ์ผ์ง๋ง, ์ฌ์ค ์ด๋ ๊ฒ ๋ฐฐ์ด ์์ ์๋ ์ธ์๋ค์ ๋จ์ ํธ์ถํ ๊ฒฝ์ฐ์๋ ํจ์ฌ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๋ค.function printAll(**...**args) { for (const arg of args) { console.log(arg); } } printAll("AA", "BB", "CC");
for of ๋ฌธ์ ์ฌ์ฉํด ์ด๋ ๊ฒ๋ ์์ฑํ ์ ์์ผ๋ฉฐ,
function printAll(**...**args) { args.forEach((arg) => console.log(arg)); } printAll("AA", "BB", "CC");
forEach๋ฅผ ์ฌ์ฉํด ์ด๋ ๊ฒ ๋ ์งง๊ฒ ์์ฑํ ์๋ ์๋ค!
(๋ ์์ธํ ๋ด์ฉ์ ๋์ค์ ๋ค์ ์ ๋ฆฌํ๊ฒ ์!)
๐คช ๋งค๊ฐ ๋ณ์(parameter)์ ์ ๋ฌ ์ธ์(argument)๊ฐ ์ ํํ ๋ญ์ง ํท๊ฐ๋ ค์ ์ ๋ฆฌํด๋ณด์๋ค....
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋งค๊ฐ ๋ณ์์ ์ ๋ฌ ์ธ์๋ฅผ ์ ๋นํ ์์ด ์ฐ๊ธฐ๋ ํ๊ณ , ๋ฌธ๋งฅ์ ๋ฐ๋ผ ์๋ฏธ๋ฅผ ๋ฌ๋ฆฌ ํด์ํ๊ธฐ๋ ํ๋๋ฐ... ์๋ฐํ ๋งํด์ ๋งค๊ฐ๋ณ์๋ ํจ์์ ์ ์๋ถ๋ถ์ ๋์ด๋์ด ์๋ ๋ณ์๋ค์ ์๋ฏธํ๋ฉฐ, ์ ๋ฌ์ธ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์ ๋ฌ๋๋ ์ค์ ๊ฐ์ ์๋ฏธํ๋ค.
์ด๋ฐ ์๋ฏธ๋ฅผ ๋ช ํํ ํ๊ธฐ ์ํด ๋งค๊ฐ๋ณ์๋ ๋ณ์(variable)๋ก, ์ ๋ฌ์ธ์๋ ๊ฐ(value)์ผ๋ก ๋ณด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
let globalMessage = "global" // global variable
function printMessage() {
let message = "hello";
console.log(message); // local variable
console.log(globalMessage); // ์์์๋ ๋ฐ์ ๋ณผ์์๊ธฐ ๋๋ฌธ์, ๋ฐ์์ ์ ์ธ๋ ๋ณ์๋ ์ถ๋ ฅ๋๋ค = Scope
}
printMessage(); //
console.log(message); //error => ์ง์ญ ๋ณ์๋ฅผ ๋ฐ์์ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์
์ฝ๋๋ ์์์๋ถํฐ ์์ฐจ์ ์ผ๋ก ์งํ๋๋ค๊ฐ, ์๋ณ์์ ๋๋ฌํ๊ฒ ๋๋ฉด ์๋ณ์์ ์ด๋ฆ์ ๊ฐ์ง ๋ณ์๋ฅผ ํ์ฌ ์ค์ฝํ์์ ์ฐพ๋๋ค.
โ ํ์ฌ ์ค์ฝํ์์ ์ฐพ์ง ๋ชปํ๋ฉด, ๋ฐ๊นฅ์ชฝ ์ค์ฝํ์์ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์๋ ์ฐพ์ง ๋ชปํ๋ฉด ๊ทธ ๋ค์ ์ค์ฝํ๋ฅผ.....์ด๋ฅผ ๊ฐ์ฅ ๋ฐ๊นฅ์ ์๋ ์ค์ฝํ๋ฅผ ๋ง๋ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค. ์ด ๊ณผ์ ์ ์ค์ฝํ ์ฐ์๋ผ๊ณ ํ๋ค.
๊ฐ์ฅ ๋ฐ๊นฅ์ ์๋ ์ค์ฝํ๋ ์ต์์ ์ค์ฝํ(top-level scope), ์ ์ญ ์ค์ฝํ(global scope)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
function add(x, y) {
return x + y;
console.log('Hello');
}
add(1, 2); // 3 ์ถ๋ ฅ, Hello๋ ์ถ๋ ฅ๋์ง ์๋๋ค.
return
์ ํจ์์ ๋ฐํ๊ฐ์ ๊ฒฐ์ ํ๋ค. return
ํค์๋ ๋ฐ๋ก ๋ค์์ ์ค๋ ๊ฐ์ด ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํ๋๋ฉฐ, ๋ฐํ๋๋ ์ฆ์ ํจ์ ์คํ์ด ๋๋๋ค.
โ ๊ทธ๋์ ์์ ์์ ์์ console.log('Hello');
๋ return
๋ค์ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ํธ์ถ๋์ง ์๋๋ค.
function returnUndefined() {
return; // return ๋ค์ ์๋ฌด๊ฒ๋ ์จ์ฃผ์ง ์์ผ๋ฉด ์๋์ผ๋ก undefined์ด ๋ค์ด๊ฐ๋ค.
}
function noReturn() {} //return์ ์์ ์จ์ฃผ์ง ์์๋ ๋ง์ฐฌ๊ฐ์ง
returnUndefined(); // undefined
noReturn(); // undefined
return
๋ค์ ์๋ฌด ๊ฐ๋ ์จ์ฃผ์ง ์๊ฑฐ๋, ์์ return
๊ตฌ๋ฌธ์ ์ฐ์ง ์์ผ๋ฉด ํจ์๋ ๊ธฐ๋ณธ๊ฐ์ธ return undefined;
๋ก ๋ฐํ๋๋ค.
const name = myName();
ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐํํ ๊ฐ์ ๋ณ์์ ์ ์ฅํ๊ฑฐ๋, ๋ค๋ฅธ ๋ก์ง์ ์ฌ์ฉํ ์๋ ์๋ค.
function upgradeUser(user) {
if (user.point > 10) {
๋์ถฉ ์์ฒญ ๊ธธ๊ณ ๋ณต์กํ logic...
}
}
๋ง์ฝ, user์ point๊ฐ 10 ์ด์์ผ๋๋ง ๋ฌด์ธ๊ฐ ์ ๊ทธ๋ ์ด๋๋ฅผ ์งํํ๋ ๋ก์ง์ด ์๋ค๋ฉด, ์์ ๊ฐ์ด ์์ฑํ๋ฉด ์์ bad bad๐ ๐ปโโ๏ธ!!
{ } ์์์ ๊ธธ๊ณ ๋ณต์กํ ๋ก์ง์ ์์ฑํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค!
function upgradeUser(user) {
if (user.point <= 10) {
return;
}
๋์ถฉ ์์ฒญ ๊ธธ๊ณ ๋ณต์กํ logic...
}
๊ทธ๋์ ์ด๋ ๊ฒ, ์กฐ๊ฑด์ด ๋ง์ง ์์๋๋ ๋น ๋ฅด๊ฒ return
ํด์ ํจ์๋ฅผ ์ข
๋ฃ์ํค๊ณ , ๋ณต์กํ ๋ก์ง์ ๊ทธ ๋ค์ ์์ฑํ๋๊ฒ ๋ ์ข๋ค!!
ํจ์ ์ด๋ฆ์ ๋ถ๋ฅด๋ฉด, ํจ์ ๋ด์ ์๋ ์ฝ๋๊ฐ ์คํ๋๋ค.
function checkCorrect() {
let hi = "์๋
ํ์ธ์";
return hi;
} // ํจ์ ์ ์ (checkCorrect ํจ์๊ฐ ๋ฌด์์ ํ๋ ๊ฒ์ธ์ง)
checkCorrect(); // ํจ์ ํธ์ถ(์คํ) ( checkCorrect ํจ์์ ์ด๋ฆ์ ๋ถ๋ฅด๊ธฐ ์ ๊น์ง๋ hi ๋ณ์๊ฐ ์์ฑ๋์ง๋ ์๊ณ , ์๋
ํ์ธ์! ๋ผ๋ ๋ง๋ ์๋ฌ๋ค.)
ํจ์๋ฅผ ํธ์ถํ๋ ํํ๋ ์๋์ ๊ฐ์ด ํจ์ ์ด๋ฆ์ ๊ดํธ ()๋ฅผ ์ฌ๋ซ์์ฃผ๋ฉด ๋๋ค.
function getTax(price) {
return price * 0.1;
}
function calculateTotal(price) {
return price + getTax(price); // ๋ค๋ฅธ ํจ์ ํธ์ถ
} // ์ฌ๊ธฐ๊น์ง "์ด๋ฐ ํจ์๊ฐ ์๋ค~" ํ๊ณ ๋ณ์ ์ ์ธ
const result = calculateTotal(3500); // ํจ์ ํธ์ถ => ์ค์ ๋ก ํจ์๊ฐ ์คํ๋๋ ์์
console.log(result); // 3850
console.log(calculateTotal(4000)); // 4400