자바스크립트에서 불변성이란?? 객체가 생성된 이후 그 상태를 변경할 수 없는 것을 의미한다. 원시형 타입은 불변성을 유지하고, 참조형 타입들은 변경이 가능하다.
자바스크립트의 함수는 객체다?? 함수의 치환이 되면, 두 함수는 같은 주소번지를 갖게 된다. 객체이기 때문에 같은 이름으로 함수를 선언할 수 없다.(오버로딩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)) //14
ES6 이후(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.display
import
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 loginKakao
toggle() 켜져있음 꺼주고, 꺼져있음 켜주는 것
<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보다 기능 적음 |