5. Arrow function
- sub-program
๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ด ์๋๊ฑด ๋ชจ๋ ๋ค๋ฅธ function์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ.
ํ๋ก๊ทธ๋จ ์์์ ์์ ๊ธฐ๋ฅ๋ค์ ์ํํ๋ ๊ฒ์ด function์ด๋ค
Input์ผ๋ก parameter๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ ,
Output์ผ๋ก return์ ํ๋ ๊ฒ์ด function
๊ทธ๋์, ์ธ์ด ์์ฒด์ ์กด์ฌํ๋ function์ ์ฐ๊ฑฐ๋
API(application programming Interface)๋ฅผ ์ธ ๋, function์ ์ด๋ฆ์ ๋ณด๊ณ ๊ทธ ๊ธฐ๋ฅ์ ์์ํ ์ ์์
์ ๋ฌํด์ผํ๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๋ญ์ง, ์ด๋ค ๊ฐ์ด return๋๊ธฐ๋ฅผ ๊ธฐ๋ํ ์ ์๋์ง ์ด๋ฐ Interface๋ฅผ ๋ณด๋ฉด์ ์์ํ ์ ์๋ค
๊ทธ๋์ Input๊ณผ output์ด ์ค์ํ๊ณ , function์ ์ด๋ฆ์ด ์ค์ํ ๊ฒ!
function
ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ์ ์ธ ๋น๋ฉ๋ธ๋ญ
sub program์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ์ฌ๋ฌ๋ฒ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
ํ๊ฐ์ง์ task๋, ์ด๋ค ๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ์ฐ์ฌ์ง
## 1. function declaration
ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ!
function name (param1,param2) { body... return; }
function ํค์๋ ์
๋ ฅ
name ์ด๋ฆ ์ง์
parameters ๋์ด
body ํจ์์ ๊ธฐ๋ณธ์ ๋น์ฆ๋์ค ๋ก์ง ์์ฑ
return
- ํ๋์ ํจ์๋ ํ๊ฐ์ง์ ์ผ๋ง.
- ๋ณ์ ๋ค์ด๋ฐ์ด ๋ช ์ฌ์ด๋ฏ์ด ํจ์ ๋ค์ด๋ฐ์ doSomethingํํ, command ํํ, verb ํํ๋ก
-
๋ง์ฝ ์ด๋ฆ์ง๋๊ฒ ๋๋ฌด ์ด๋ ต๋ค๋ฉด? ๋๋ฌด ๋ง์ ์ผ์ ํ๊ณ ์์ง๋ ์๋์ง ์๊ฐ! * e.g. createCardAndPoint -> createCard, createPoint๋ก ์ธ๋ถํ
- function์ JS์์ object๋ก ๊ฐ์ฃผ๋๋ค
๊ทธ๋์ ๋ณ์์ ํ ๋นํ ์ ์๊ณ , parameter๋ก ์ ๋ฌ์ด ๋๊ณ , ํจ์๋ฅผ returnํ ์ ์๋ ๊ฒ.
Type Script )
function log(message:string) { console.log(message); }
TS์์๋ parameter๋, return์ ํ์ ์ ์ง์ ํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฌ๋ค.
- parameter์ ํ์ ์ (message:string) ์ด๋ ๊ฒ -return์ ํ์ ์ (message:string):number์ด๋ ๊ฒ
ํ์ ์ ๋ช ์ํด์ค์ผํจ
-
์ด TS๋,
- ๊ท๋ชจ์๋ ํ๋ก์ ํธ
- ์ฌ๋ฌ ๊ฐ๋ฐ์์ ํ์ ์ ํ ๋
- ์ฐ๋ฆฌ๊ฐ ์์ฑํ ๊ฒ์ APIํํ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ๊ณตํด์ผํ ๋
- ์์ ๊ฐ์ ์ํฉ์์ ๊ฐ๋ฐ์ ์ํํ๊ฒ ๋ง๋ค์ด์ค๋ค!
-
ํจ์์ ์ธํฐํ์ด์ค๋ง ๋ด๋, ์ด ํจ์๊ฐ ๋ญ ํ๋ ํจ์์ด๊ณ ์ด๋ค ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํด์ผํ๊ณ ์ด๋ค ๋ฐ์ดํฐ ํ์ ์ธ์ง, ์ด๋ค ๊ฐ์ด ๋ฆฌํด๋๋์ง๋ฅผ ๋ช ํํ๊ฒ ์ ์ ์๊ธฐ ๋๋ฌธ์.
## 2. Parameters
function์ ์ ๋ฌ๋๋ ์ด parameters๋
-
- Premitive parameters: passed by value
- ๋ฉ๋ชจ๋ฆฌ์ ๊ทธ๋๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์, value๊ฐ ์ ๋ฌ๋๋ค
-
- object parameters: passed by reference
- reference๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ reference๊ฐ ์ ๋ฌ๋๋ค
function changeName(obj) {
obj.name = 'coder';
}
//์ ๋ฌ๋ ๊ฐ์ฒด ์์ name์ ๋ณ๊ฒฝํ๋ ํจ์
const ellie = { name: 'ellie'};
changeName(ellie);
console.log(ellie); //ellie
object๋ reference๋ก ์ ์ฅ๋จ. ์๋๋ ์์
object๋ reference๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์,
ํจ์ ์์์ ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ๋ ์ฌํญ์ด ๊ทธ๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฉ๋๋ค
3. Default parameters (added in ES6)
default ๊ฐ์ ๋ฏธ๋ฆฌ ์ง์ ํ ์ ์๋ default parameters
- ๊ธฐ์กด์ ๋ฐฉ์
function showMessage(message, from) {
if(from == undefined) {
from = 'unknown';
}
console.log(`${message} by ${from}`);
}
showMessage('Hi!');
๊ธฐ์กด์๋ ์ด๋ ๊ฒ, undefined์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์กฐ๊ฑด๋ฌธ์ ์์ฑํด์ผํ์ง๋ง
- ES6์ ๋ฐฉ์
function showMessage(message, from = 'unknown') {
console.log(`${message} by ${from}`);
}
showMessage('Hi!');
์ฌ์ฉ์๊ฐ parameter๊ฐ์ ์ ๋ฌํ์ง ์์๋, ๊ฐ์ด ์ด๋ ๊ฒ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ฒด๋์ด์ ์ฌ์ฉ๋๋ค
- Rest parameters (added in ES6)
function printAll(...args) {
for(let i = 0; i < args.length; i++) {
console.log(arg[i]);
}
}
printAll('dream','coding','ellie'); //์ธ์๋ก ์ธ๊ฐ์ ๊ฐ์ ์ ๋ฌ
โฆ ์ด๋ ๊ฒ ์ ๋ฌํ๋ฉด ๋ฐฐ์ด ํํ๋ก ์ ๋ฌ์ด ๋๋ค!
โdreamโ,โcodingโ,โellieโ ์ด๋ ๊ฒ ์ ๋ฌ๋ฐ์ ๊ฐ์ ์ธ๊ฐ์ ๊ฐ์ด ๋ด๊ธด ๋ฐฐ์ด์ด ๋๋ค
function printAll(...args) {
for(const arg of args) {
console.log(arg);
}
}
printAll('dream','coding','ellie'); //์ธ์๋ก ์ธ๊ฐ์ ๊ฐ์ ์ ๋ฌ
for๋ฌธ๋ณด๋ค ๊ฐ๋จํ for of๋ฌธ์ผ๋ก ์์ฑํ ์๋ ์์
arg์ ์๋ ๋ชจ๋ ๊ฐ๋ค์ด, ์ฐจ๋ก๋๋ก ํ๋์ฉ arg๋ก ์ง์ ์ด ๋๋ฉด์ ์ถ๋ ฅํ๊ฒ ๋๋ค
function printAll(...args) {
args.forEach((arg) => console.log(arg));
}
}
printAll('dream','coding','ellie'); //์ธ์๋ก ์ธ๊ฐ์ ๊ฐ์ ์ ๋ฌ
5. Local scope
์ฐธ์กฐ) closer, LexicalEnvironment
- ๋ฐ์์๋ ์์ด ๋ณด์ด์ง ์๊ณ , ์์์๋ง ๋ฐ์ ๋ณผ ์ ์๋ค
์ด๊ฒ์ด scope์ ๊ฐ๋
let globalMessage = 'global'; // global variable ์ ์ญ๋ณ์
function printMessage() {
let message = 'hello';
console.log(message); // lacal variable ์ง์ญ๋ณ์
console.log(globalMessage);
function printAnother() {
let childMessage = 'hello';
}
// console.log(childMessage) //error
}
printMessage();
์์์ ๋ถ๋ชจ์๊ฒ์ ์ ์๋ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์๋ค์ง๋ง
์์ ์์ ์ ์๋ childMessage๋ฅผ ๋ถ๋ชจ์์ ๋ณผ ์ ์์
- ์ค์ฒฉ๋ ํจ์์์ ์์์ ํจ์๊ฐ, ๋ถ๋ชจ ํจ์์ ์ ์๋ ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ๋ค์ด ๋ฐ๋ก closer.
6. Return a value
function sum(a, b) {
return a + b;
}
const result = sum(1,2); //3
console.log(`sum: ${sum(1,2)}`);
parameters๋ก ๊ฐ์ ์ ๋ฌ ๋ฐ์์, ๊ณ์ฐ๋ ๊ฐ์ returnํ ์ ์๋ค
let globalMessage = 'global';
function printMessage() {
let message = 'hello';
console.log(message);
console.log(globalMessage);
function printAnother() {
let childMessage = 'hello';
}
return undefined;
}
printMessage();
์๊น ๋ดค๋, ์ด๋ ๊ฒ return์ด ์๋ ํจ์๋ค์ return undefined๊ฐ ๋ ๊ฒ๊ณผ ๊ฐ๋ค
๋ชจ๋ ํจ์๋ return undefined์ด๊ฑฐ๋, ๊ฐ์ Returnํ ์ ์๋ค
7. Early return, early exit
- ๋์ ์!
Function upgraderUser(user) {
if(user.point > 10) {
//long upgrade logic
}
}
ํด๋น ์กฐ๊ฑด์ผ ๋์๋ง ๋ฌด์ธ๊ฐ ์๋ํ๋ ๋ก์ง์ด ์๋ค. block์์์ ๋ก์ง์ ๋ง์ด ์์ฑํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
- ์ข์ ์!
Function upgraderUser(user) {
if(user.point <= 10) {
return;
}
//long upgrade logic
}
if else๋ฅผ ๋ฒ๊ฐ์์ ์ฐ๋ ๊ตฌ์กฐ๋ณด๋ค๋, ์กฐ๊ฑด์ด ๋ง์ง ์์ ๋ ์ด๋ ๊ฒ ๋นจ๋ฆฌ return ์์ผ๋ฒ๋ฆฌ๊ณ !
์กฐ๊ฑด์ด ๋ง์ ๋๋ง ๊ทธ ๋ค์์ผ๋ก ์์ ํ์ํ ๋ก์ง๋ค์ ์ญ ์คํํ๋ ๊ตฌ์กฐ๊ฐ ์ข๋ค.
- ์กฐ๊ฑด์ด ๋ง์ง ์๋ ๊ฒฝ์ฐ
- ๊ฐ์ด undefined์ธ ๊ฒฝ์ฐ
- ๊ฐ์ด -1์ธ ๊ฒฝ์ฐ