자바스크립트에서 불변성이란?? 객체가 생성된 이후 그 상태를 변경할 수 없는 것을 의미한다. 원시형 타입은 불변성을 유지하고, 참조형 타입들은 변경이 가능하다.
자바스크립트의 함수는 객체다?? 함수의 치환이 되면, 두 함수는 같은 주소번지를 갖게 된다. 객체이기 때문에 같은 이름으로 함수를 선언할 수 없다.(오버로딩x)
특정한 일을 수행하는 코드의 집합
장점 : 묶어두면 재사용이 가능하고, 높은 가독성을 가지면서 유지보수성 좋음
💡 **언제 선언하지?** 같은 일을 반복하지 않고, 함수로 만들어서 재사용 가능
  	- npm 설치옵션 차이(https://phsun102.tistory.com/29)
- --save : devDependencies가 아니라 dependencies에 패키지가 추가(npm5 이후부터는 자동 설치되므로 생략 가능)
- -D : devDependencies에 패키지들이 추가
- 익스프레스 프로젝트를 자동으로 생성해주는 express-generator모듈을 설치
함수
기존 작성법/Arrow함수 작성법
// 순차적진행 -> Arrow 함수는 위에서 사용x, 일반함수는 호이스팅 이슈와 같이 무조건 제일 앞쪽
console.log(funName2('이','지연')); //사용 o
console.log(funName('이','지연'));  //defined
// 함수(에로우 함수)
funName = (firstName, lastName) => {
  return `${firstName} ${lastName}`;
};
// 함수(기존작성)
function funName2(firstName, lastName) {
  return `${firstName} ${lastName}`;
}JS에서 함수는 객체
JS 함수의 치환 가능(객체 급이니까) → 치환이 된 두 함수는 같은 주소번지를 갖게 됨.
- 같은 이름의 함수를 가질 수 없음(오버로딩 x)
 const hap = add          //같은 주소번지
 console.log(hap == add)  //같은 값
 console.log(hap === add) //같은 타입
 console.log(typeof hap) 
 console.log(typeof add)
 ```
 
 [파라미터]
JS의 파라미터의 기본값은 undefined이다.
JS는 파라미터 정보는 함수 내부 접근 가능한 arguments 객체에 저장됨
function hap(a, b) {
  console.log(arguments) //[Argument] {'0':1,'1':2,'2':3} [Arguments] {'0':1,'1':2,'2':null}
  console.log(arguments[0]) // 1 1
  console.log(arguments[2]) // 3 null
  // return a + b + arguments[2] //2
  return a + b + arguments[1] // -> 이렇게도 사용이 가능함, but 사이드 이펙트 생길 수 있음.
  // return a + b
}
console.log(hap(1, 2, 3)) //5
console.log(hap(1, 2, null)) //5
console.log(hap(4, 5, 4)) //14ES6 이후(Parcel, Webpack), 매개변수의 기본 값을 줄 수 있음. (따로 호출할 때 값을 주지 않으면 초기 값인 파라미터로 계산됨)
function hap3(a=2,b=3){
  return a+b
}Rest Parameter → numbers의 값이 아래 호출된 값으로 치환이 됨
```jsx
function sum(...numbers) {
  console.log(numbers) // [1,3,5,7,9]
}
sum(1,3,5,7,9)
function sum2(x, y, ...numbers) {
  console.log(x) //1
  console.log(y) //3
  console.log(numbers) // [5,7,9]
}
sum2(1, 3, 5, 7, 9)
```[리턴타입]
JS는 리턴타입 선언 자리 x → 쓰지 않으면 undefined 반환
return을 함수 중간에 만나면 함수가 종료
```jsx
//전달되는 것이 유효성 체크(예:음의 정수는 계산x)
function m(num) {
  if (num > 0) {
    console.log(num)
  } else {
    return
  }
}
console.log(m(4))  //4
console.log(m(-4)) //
```[콜백함수]
함수도 객체가 될 수 있다. 일급 객체라고 말하기도 함.
언제 호출될지 모르는 경우에도 콜백함수라고 함.
[일급객체]
일반객체 처럼 모든 연산이 가능
함수의 매개변수로 전달 가능
함수의 반환값으로 쓸 수 있음
할당 명령문 사용 가능
동일비교대상
[일급함수] → first-classfunction - 코트린이나 파이썬에서도 지원. 자바도 8부터
함수가 일반객체 처럼 모든 연산이 가능한 것
함수의 매개변수로 전달 가능함
함수의 반환값으로 쓸 수 있음
할당 명령문 사용 가능
동일비교대상
[고차함수] - Higher-order function
인자로 함수를 받거나(콜백함수)
함수를 반환하는 함수를 고차함수라함
```jsx
const hap = (a, b) => a + b
const minus = (a, b) => a - b
// 고차함수 -> 매개변수에 함수가 들어감 (매개변수 값은 함수 밖에서 호출할 때 결정된다 ->콜백함수)
function account(a, b, action) {
  if (a < 0 || b < 0) {
    //or
    return
  }
  let result = action(a, b)
  return result
}
//action은 콜백함수, 언제 호출될지 모르는 경우에도 콜백함수라고 함.
//전달 당시 바로 호출해서 반환값을 전달하는 것이 아니라 함수를 가리키고 있는 함수의 참조값이 전달
//필요한 순간 호출
console.log(account(1, 2, hap)) //3
console.log(account(1, 2, minus)) //-1
console.log(account(-1, 2, minus)) //undefined
```[함수 표현식]
함수 선언문 function name(){}
함수 표현식 const name = function(){} - 익명함수
즉시 실행 함수 표현 IIFE(Immedicately-Invoked Function Expressions) ->선언하면서 ();에서 바로 호출
```jsx
let hap = function(a,b){
  return a+b
}
hap =(a,b)=>a+b //return 생략 가능
console.log(hap(1,2));
(function run(){
  console.log('run');
})();
```[함수 작성 주의사항]
불변성 Immutability
자바스크립트에서 불변성이란 객체가 생성된 이후 그 상태를 변경할 수 없는 것을 의미
원시형은 원본 영향 x 불변성을 유지하고, 참조형은 원본 영향 o 변경이 가능하다.
function funcA(num) {
  num = 5
  console.log(num)
}
// console.log(num) //defined
//원시형인 경우, 함수내부에서 변경되더라도 외부에 영향 x
const value = 3 //3으로 초기화
funcA(value) //함수내부에서 값이 바뀜
console.log(value) //바깥에는 영향이 없음
//참조형인경우 원본이 바뀜 -> 가급적 자제 (call by reference)
const fruit = { name: '🍓' }
function funcB(obj) {
  obj.name = '🍉'
  console.log(obj)
}
funcB(fruit)
console.log(fruit) //{ name: '🍉' }[객체생성]
고전 - 생성자 함수
ES6 이후 클래스 내부에 함수 추가 가능(에로우 함수로 작성)
class Fruit {
  constructor(name, emoji) {
    this.name = name
    this.emoji = emoji
  }
  display = () => {
    console.log(`${this.name} ${this.emoji}`)
  }
}
//클래스 인스턴스화 - kiwi와 watermelon은 Fruit 클래스의 인스턴스 변수
const kiwi = new Fruit('kiwi', '🥝')
const watermelon = new Fruit('watermelon', '🍉')
console.log(kiwi)
console.log(`${kiwi.name} ${kiwi.emoji}`)
console.log(`${watermelon.name} ${watermelon.emoji}`)
kiwi.display
watermelon.displayimport
  import { DeptVO } from './deptvo'
           -------         --------
//import {클래스이름} from '위치경로'| 폴더 | 구성 | 내용 | 
|---|---|---|
| bin | www | express 사용 관련 함수, 포트설정(3000) | 
| public-javascripts | authLogic | 인증 관련 js(구글, 카카오 인증 API 활용) | 
| public-javascripts | firebase.js | 구글firebase 연결 관련 | 
| public-styleshteets | style.css | 페이지 구성관련 | 
| routes(화면중계) | index.js | 페이지 설계, 로그인(물리적 위치→login.ejs) | 
| routes | users.js | 라우터 설정(대쉬보드, 회원가입, 장바구니 등 가능) | 
| views | error.ejs | html 랜더링(브라우저에 표시) | 
| views | footer.ejs | footer 구성 | 
| views | header.ejs | header구성(whit 부트스트랩) | 
| views | home.ejs | 홈페이지 글 | 
| views | index.ejs | HTML 문서의 구조와 외부 리소스를 로드 | 
| views-auth | login.ejs | 웹 애플리케이션의 기본 설정 | 
| - | app.js | 뷰 엔진 설정, 정적페이지의 위치 설정, 에러 핸들러 등(모듈로딩, 앱 생성, 미들웨어 생성-이동(next), 라우트설정, 에러 핸들러, 앱 내보내기 등) | 
import, get함수로 생성
import {
  getAuth,
  GithubAuthProvider,
  GoogleAuthProvider,
} from 'https://www.gstatic.com/firebasejs/9.22.1/firebase-auth.js';
class AuthLogic {
  constructor() {
    this.auth = getAuth();
    this.gitProvider = new GithubAuthProvider();
    this.googleProvider = new GoogleAuthProvider();
  }
  getUserAuth = () => {
    return this.auth;
  };
  getGithubAuthProvider = () => {
    return this.gitProvider;
  };
  getGoogleAuthProvider = () => {
    return this.googleProvider;
  };
}export로 요청 → 콜백
export const loginKakao = (params) => {
  return new Promise((resolve, reject) => {
    try {
      const response = axios({
        method: 'get',
        url: '카카오토큰을 받아올 URL주소 -카카오개발자 센터 긁어옴',
        params: params,
      });
      console.log(response);
      resolve(response);
    } catch (error) {
      reject(error);
    }
  });
}; //end of loginKakaotoggle() 켜져있음 꺼주고, 꺼져있음 켜주는 것
<script>
  console.log(`header - ${localStorage.getItem('email')}`);
  // 로컬스토리지에 이메일 주소 있어?? 
  // toggle() 켜져있음 꺼주고, 꺼져있음 켜주는 것
  if(localStorage.getItem('email')){ //값이 들어가기 때문에 true임!! 
    $('#login,#logout,#cart,#mypage').toggle();
    $('#logout a').html(localStorage.getItem('email'))
  }
  // 로그아웃 클릭 시 처음 페이지로 돌아가도록 설정 localhost:3000/으로 이동
  $('#logout').on('click',()=>{
    localStorage.clear()
    location.href="/"
  })
라이브러리 vs 프레임워크?
💡 **라이브러리(활용가능 도구집합) vs 프레임워크(클래스, 인터페이스 집합)?** 둘의 차이는 제어 흐름의 주도성이 누구에게(어디에) 있는가에 있음. Flow를 누가 쥐고 있느냐. 둘프레임워크는 개발자가 흐름을 쥐어 코드를 완성성 라이브러리는 개발자가 흐름을 만들지만, 그 흐름 속에 라이브러리를 가져와서 사용하는 것| Ajax | fetch API | Axios | 
|---|---|---|
| 빠르게 동작하는 동적 웹페이지 개발 용이 | 내장 라이브러리, import없이 사용 | 브라우저, Node.js위한 promise API 활용 라이브러리 | 
| 핵심 객체 XMLHttpRequest 객체(웹페이지 일부 갱신 가능(비동기처리)) | XMLHttpRequest의 대체자(비동기 요청 더 쉽게) | 브라우저 호환성 뛰어남. | 
| 최근은 JQuery 내 ajax가 대세? | promise기반 동작→콜백지옥 탈출 | 자동으로 JSON 형식으로 변환, React에서 주로 사용 | 
| 콜백지옥 생길수도.. | 구형브라우저 지원x, API요청 취소x | 라이브러리 설치 필요, 아직 fecth보다 기능 적음 |