패스트캠퍼스
함수 [패스트캠퍼스 챌린지 03일차]
온다카키onthekaki
2021. 9. 8. 18:13
기명 함수 : function 함수이름 () {}
이름이 있는 함수
```jsx
function a() {
console.log(1234)
}
//함수 호출
a()
// 1234
```
익명 함수 : function () {}
이름이 없는 함수
```jsx
let b = function () {
console.log(1234)
}
//함수 호출
b()
// 1234
```
함수 호출 : 함수이름() or 변수이름()
선언된 함수 이름으로 호출할 수 있다
방식은 → 함수이름()
괄호 안에는 인수를 삽입하여 호출 가능
함수를 변수에 왜 담아?
- 빌드업 고고
```jsx
function sum(x, y) {
console.log(x + y)
}
/*함수 호출*/
sum(1, 3) // 4
/*재활용 가능*/
sum(4, 12) // 16
```
- 콘솔로그 대신 리턴을 넣어보았다
```jsx
function sum(x, y) {
return x + y
}
sum(1, 3) // 콘솔 창에 암 것두 안 뜸
```
- 결과를 보고 싶나?
```jsx
function sum(x, y) {
return x + y
}
console.log(sum(1, 3)) // 4
console.log(sum(4, 12)) // 16
console.log(sum(1, 3)) + sum(4,12)) // 20
```
- 근데 좀 비효율적임. 함수를 여러번 동작시키잖아
> 함수가 실행될 때마다 로직을 동작시키면 그만큼 컴터 자원이 들어감.
여러 번 함수를 실행하는 건 비효율적임
함수를 사용할 때는 함수가 호출되는 횟수를 최대한 줄이는 게 중요
함수 결과가 반복적으로 사용되는 경우에는 변수에 담아서 쓰기
변수에 담아보자
```jsx
function sum(x, y) {
return x + y
}
const a = sum(1, 3)
const b = sum(4, 12)
console.log(a) // 4
console.log(b) // 16
console.log(a + b) // 20
```
return '함수를 종료'하다
- 빌드업
```jsx
function sum(x, y) {
console.log(x)
return x + y
}
sum(1, 3)
// 1
// console.log(x)가 출력된 거임
```
- console.log(x)의 위치를 바꿔보았다. return 아래로.
```jsx
function sum(x, y) {
return x + y
console.log(x)
}
sum(1, 3)
// 아무 값도 나오지 않음.
// 콘솔로그가 리턴 아래로 이동해서
```
- return 은 함수를 종료한다는 의미로 쓸 수 있음
```jsx
function sum(x, y) {
if (x < 2) {
return
}
return x + y
}
console.log(sum(1, 3)) // undefiend
```
- 조건문 내부 return에 값을 줘보자
```jsx
function sum(x, y) {
if (x < 2) {
return 123
}
return x + y
}
console.log(sum(1, 3)) // 123
```
- x에 2 이상을 줘서 if문 패스해보자
```jsx
function sum(x, y) {
if (x < 2) {
return
}
return x + y
}
console.log(sum(7, 3)) // 10
```
매개변수 일일이 지정하기 않고 Arguments 써보기
- 따로 매개변수를 지정하지 않아도 함수 내부에서 arguments라는 객체를 사용 가능
- 아주 많이 사용되는 방법은 아니지만...
- s 빼먹지 말기
- 그래서 굳이 왜 arguments를 쓰는 건데???
함수를 실행할 때 사용하는 인수가 너무 많아서
일일이 매개변수를 지정하기 힘들 때 이넘을 활용하면 됨
---
- 매개변수를 지우고 arguments 고고
```jsx
//function sum(x, y) 매개변수 지워보자
function sum() {
console.log(arguments)
return
}
console.log(sum(7, 3))
/*
Arguments(2) [7,3 등등]
0: 7
1: 3
*/
//콘솔에 7, 3이 배열 형태로 출력됨
```
- 인수 반환해보자
```jsx
function sum() {
console.log(arguments)
return arguments[0] + arguments[1]
// 아규먼츠 0번째랑 1번째 값 반환하겠다는 거임
}
console.log(sum(7,3)) //10
```
→ 일반적인 경우에는 arguments 객체에 '0번째 1번째' 이런 건 직관적이지 못해서 별로임
되도록이면 이름을 지정해서 그 인수가 어떤 의미인지 조금 명시적으로 나타내주는 게 굿굿
→ 그치만! 인수가 너무너무 많아서 매개변수 이름을 일일이 지정하기 힘든 경우에
arguments 객체를 통해 일괄적으로 관리해줄 수 있다규
화살표 함수. 함수를 축약
- 두 코드는 동일한 내용
- 내가 아는 일반적 함수 표현
```jsx
const double = function (x) {
return x * 2
}
console.log('double ', double(7))
//14
/*
더블이란 변수에 익명의 함수를 할당해서 함수 표현 작성.
x는 이 함수의 매개 변수.
밖에서 데이터를 받아서 거기에 곱하기 2를 한 값을 리턴 키워드로 함수 밖으로 내보내버렷.
콘솔 로그. 인수 7을 가진 더블이란 함수 실행
*/
```
- 화살표 함수로 바꿔보면
```jsx
const doubleArrow = (x) => {
return x * 2
}
console.log('doubleArrow ', doubleArrow(7))
//14
```
- 두 코드의 차이점은 뭘까?
첫번째 녀석은, 펑션 키워드 사용
두번째 녀석은, 화살표 함수 사용. / 펑션은 없고 => 사용. ( 앞뒤로 띄어쓰기 있음 )
---
- 일반 함수와 화살표 함수의 가장 큰 차이점은 ? // 축약!
- 매개변수 하나일 때 매우 간단
매개변수 => 실행문
ex) x => x * 2
- 중괄호 주의 feat. 객체 데이터
- ({ 객체 데이터 })
- 일반적 함수 표현
```jsx
const doubleArrow = (x) => {
return x * 2
}
console.log('doubleArrow ', doubleArrow(7))
```
- 화살표 함수를 이용해보자
```jsx
const doubleArrow = x => x * 2
console.log('doubleArrow ', doubleArrow(7))
//14
```
- 이어서, 실행문을 중괄호로 감싸보자. 그냥 감싸보자 어떻게 되나
```jsx
const doubleArrow = x => { x * 2 }
console.log('doubleArrow ', doubleArrow(7))
/*
실행문 반환될 수 없음
undefined가 떴던가...
*/
```
- return 키워드를 넣으니까 도르마무!!!!
```jsx
const doubleArrow = (x) => {
return x * 2
}
console.log('doubleArrow ', doubleArrow(7))
```
---
- 중괄호 하면 생각나는 그것. 객체 데이터.
- 문자, 숫자, boolean, null, undefined, array[ ] 모두 잘 반환됨.
객체 데이터 빼고. 객체 데이터는 콘솔에 내용이 제대로 출력되지 않음.
- 그럼 중괄호 { } 를 사용하는 객체 데이터는 어떻게 하나?!!!
- 중괄호를 소괄호로 감싸면 축약해서 사용 가능 ({ 이렇게 })
```jsx
const doubleArrow = x => ({
name: 'Kaki'
})
console.log('doubleArrow ', doubleArrow(7))
// name: "Kaki"
```
---
## 화살표 함수 축약 과정
- 화살표 함수 사용 전
```jsx
const double = function (x) {
return x * 2
}
console.log('double ', double(7))
//14
```
- 화살표 함수
```jsx
const doubleArrow = (x) => {
return x * 2
}
console.log('doubleArrow ', doubleArrow(7))
```
- 리턴 키워드와 중괄호를 생략
```jsx
const doubleArrow = (x) => x * 2
console.log('doubleArrow ', doubleArrow(7))
```
- 매개 변수 하나면 소괄호도 생략 가능
```jsx
const doubleArrow = x => x * 2
console.log('doubleArrow ', doubleArrow(7))
/*
x => x * 2
매개변수 => 실행문
이 부분이 하나의 함수인 것임
익숙해지면 잘 쓰게 될 거다
*/
```
- 매개 변수 하나일 때만 화살표 함수 가능?? 노노. 매개변수 추가 가능
```jsx
const double = function (x, y) {
return x * 2
}
// 매개 변수 둘이어도 화살표 함수 가능
const doubleArrow = (x, y) => x * 2
```
즉시실행함수 IIFE
> Immediately Invoked Function Expression
즉시 실행하는 함수 표현
- 즉시실행함수가 왜 필요한데요?
이렇게 한번 사용하고 말 함수라면 굳이 이름까지 만들어 호출할 필요가 없음
```jsx
const a = 7
function double() {
console.log(a * 2)
}
double();
//14
```
- 콘솔 창 에러 주의
세미콜론으로 코드 마무리 해주면 될 거야
---
- 빌드업
```jsx
function () {
console.log(a * 2)
}
/*
익명 함수. 이름이 없어서 실행할 수 없음.
*/
```
- #1 소괄호 두 개를 이용해보자. ( 함수 )( )
```jsx
(function () {
console.log(a * 2)
})();
//14
```
- #2 소괄호 위치 이동. ( 함수 ( )) 이 방법 추천
```jsx
(function () {
console.log(a * 2)
}());
//14
```
호이스팅 Hoisting
> 함수 선언부가 유효 범위(scope) 최상단으로 끌어올려지는 현상
- 언제 유용?
JS는 함수의 이름만 봐도 대략적인 함수의 로직을 추측할 수 있기 때문에,
호이스팅이라는 현상을 이용해서 함수를 전체 코드의 최하단에 작성
---
복잡한 내용이 많은 함수를 실행하기 위해,
이 복잡한 함수를 위에서 아래로 읽어내려가는데
함수 호출까지 가기 전에 굉장히 많은 로직들을 거쳐야 하잖음
→베리 복잡하고 해석하기 좋지 않아
---
그렇다고 함수 선언을 맨날 밑에다만 작성하란 게 아니고,
코드 해석할 때 함수 호출이 위에 있고 함수 선언이 아래에 있어도 헷갈리지 말라구
---
- 빌드업. 함수 표현부터 시작
```jsx
const a = 7
const double = function () {
console.log(a * 2)
}
double()
```
- 함수 호출 위치를 함수 표현 위로 올려보자. 에러 뜸
```jsx
const a = 7
double()
const double = function () {
console.log(a * 2)
}
//typeError. double is not a function
```
- 함수 표현을 함수 선언으로 바꾸면?? 호이스팅!
```jsx
const a = 7
double()
function double() {
console.log(a * 2)
}
// 14
```
타이머 함수
> setTimeout(함수, 시간) : 일정 시간 후 함수 실행
setInterval(함수, 시간) : 시간 간격마다 함수 실행
> clearTimeout() : setTimeout 함수를 종료
cleatInterval() : setInterval 함수를 종료
---
- 타이머 함수 굉장히 많이 사용하니까 잘 알아두기
- 시간에서 사용 되는 단위는 밀리세컨드. 1000ms = 1s
---
### setTimeout
- 빌드업 setTimeout
```jsx
setTimeout(function(){
console.log('Kaki')
}, 3000)
```
- 화살표 함수로 바꿔보자
```jsx
setTimeout(() => {
console.log('Persimmon')
}, 3000)
```
- 타이머 기능 종료해볼까 feat.addEventListener
```jsx
// html h1태그의 내용인 hello world를 누르면 종료되도록 만들어보자
const timer = setTimeout(() => {
console.log('Persimmon')
}, 3000)
const h1El = document.querySelector('h1')
h1El.addEventListener('click', () => {
clearTimeout(timer)
})
```
---
### setInterval
- 빌드업 setInterval
```jsx
const timer = setInterval(() => {
console.log('Persimmon')
}, 3000)
//3초에 한번씩 문자 데이터가 출력됨
```
- 인터벌도 종료해보자
```jsx
const timer = setInterval(() => {
console.log('Persimmon')
}, 3000)
const h1El = document.querySelector('h1')
h1El.addEventListener('click', () => {
clearInterval(timer)
})
```
콜백 Callback
> 함수의 인수로 사용 되는 또다른 함수
간단히 말해서...
1. 인수로 사용 되는 함수는 콜백이다
2. 콜백은 특정한 실행 위치를 보장하는 용도로 굉장히 많이 활용된다
---
- 빌드업...
```jsx
function timeout () {
setTimeout(() => {
console.log('Start!')
}, 3000)
}
timeout()
// 3초 뒤에 Start! 출력
```
- 빌드업...start 뒤에 Done!이 나오게 하고 싶었다
```jsx
function timeout () {
setTimeout(() => {
console.log('start')
}, 3000)
}
timeout()
console.log('Done!')
/*설정된 3초의 시간 때문에
Done!이 먼저 나오고
Start!가 나옴
*/
```
- 콜백 이용하기
- 순서를...일단 적어보겠다 (헤롱헤롱)
- timeout() 이녀석 변화 과정
→ timeout(() ⇒ {}) 이게 콜백이라고요?
→ timeout(() ⇒ { console.log('Done!'}) 음...
- function timeout (){~~~ 이녀석 변화 과정
→ function timeout (cb){~~~
- cb() 이녀석 자리 정해주기
- 설명도...일단...
timeout 함수를 호출할 때 하나의 익명함수를 인수로 사용함
그리고 그 인수가 cb라는 매개변수로 들어감
cb라는 매개변수는 아직 호출되지 않은 함수잖어
그러니까 이놈을 실행하기 원하는 자리에다 소괄호를 열어 실행해주는 거다 이거임
```jsx
function timeout (cb){
setTimeout(() => {
console.log('Kaki')
cb()
}, 3000)
}
timeout(() => {
console.log('Done!')
})
```
https://bit.ly/37BpXiC
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
#직장인인강 #직장인자기계발 #패스트캠퍼스 #패스트캠퍼스후기 #패캠챌린지 #한번에끝내는프론트엔드개발초격차패키지Online