
함수(1)에 이어서 함수 설명 추가
Data type : Function
Statement : Function

*parameter = 매개변수// 키워드   함수 이름  파라미터는 없음(매개변수)
function printHello() {
    console.log('Hello');
}  //콘솔에 Hello를 출력해
printHello();
//함수 호출
    //함수 이름  파라미터 (매개변수) message 
function log(message) {
    console.log(message);
}
log('Hello!');
log(123);
//로그 함수 호출
function changeName(obj) {
    obj.name = 'coder';
}
const ellie = { name: 'ellie' };    //ellie의 이름을 code로 변경하는 식
changeName (ellie);
console.log(ellie)
//{name : 'coder'}
<해설>
const ellie는  { name : 'ellie' } 이다.
changeName 함수의 (매개변수로 ellie)를 넣으면
obj.name = 'coder'; 에 의해  ellie.name = 'coder';라는 식이 되어
ellie 는 { name : 'coder' }가 된다!
//                  매개변수가 두 개  원하는 디폴트값 지정 가능!
function showMessage(message, from = 'unknown') {
    console.log(`${message} by ${from}`);
}
showMessage(`Hi!`);
function printAll(...args){ //...args -> array 배열
    for ( let i = 0; i < arguments.length; i++) {     //방법 1
        console.log(args[i]);
    }
    for (const arg of args) {                          //방법2
        console.log(arg);                              
    }
    args.forEach((arg) => console.log(arg));           //방법3
}
printAll('dream', 'coding', 'ellie')
영향을 주는 방향 : Global -> local (가능) local -> Global (불가능)
let globalMessage = 'global'; // global variable
function printMessage() {
    let message = 'hello';
    console.log(message); // local variable
    console.log(globalMessage)   //global  상위 블럭의 정보는 하위 블럭에서도 적용 됨!
    function printAnother() {
        console.log(message);
        let childMessage = 'bye';
    }
    //console.log(childMessage)     // error 하위 블럭 정보는 상위 블럭에서 적용 안됨!
}
printMessage();
function sum(a, b) {
    return a + b;
}
const result = sum(1, 2); //3
console.log(`sum: ${sum(1, 2)}`);
< 조건 > 10보다 크다!
식 작성의 안좋은 예
function urgradeUser(user) {
    if (user.point > 10) {          //조건에 충족할때
        //long upgrade logic...    // 블럭 안에 나머지 로직 작성
    }                              //가독성 떨어짐.
}
function upgradeUser(user) {
    if (user.point <= 10) {        // 조건에 부합하지 않을때
        return;                    //함수 종료
    }
    // long upgrade logic...       // 조건이 맞을때만 필요한 로직 실행
}
functions are treated like any other variable  함수는 다른 변수와 마찬가지로
an be assigned as a value to variable         변수에 할당되고
can be passed as an argument to other functions. 함수에 매개변수로 전달이 되며
can be returned by another function              리턴 값으로도 리턴이 된다.
const print = function () {         //이름 없는 함수 anonymous function
//const pritn = function name ()    // 이름 있는 함수 named function   
    console.log('print');
};
print(); 
//print
const printAgain = print;
printAgain(); 
//print
const sumAgain = sum;
console.log(sumAgain(1, 3)); 
//4
function randomQuiz(answer, printYes, printNo) {
    if (answer === 'love you') {
        printYes();
    } else {
        printNo();
    }
}
// anonymous function
const printYes = function () {
    console.log('yes!');
};
// named function
// better debugging in debrgger's stack traces
// recurisions
const printNo = function print() {
    console.log('no!');
};
randomQuiz('wrong', printYes, printNo);
randomQuiz('love you', printYes, printNo);
always anonymous
// const simplePrint = function () {
//     console.log('simplePrint!');
// };
const simplePrint = () => console.log('simplePrint!'); 
// const add = function () {
//     return a + b;
// };
const add = (a, b) => a + b; 
//복잡한 식의 경우는 아래 처럼
const simpleMultiply = (a, b) => {
    //do sometying more
    return a * b;
};
Immediately Invoeked Function Ecpression
함수의 선언을 (괄호)로 묶고 ();호출하면!! 함수를 바로 볼 수 있다!
(function hello() {
    console.log('IIFE');
}) ();
//IIFE