화살표 함수 기본 문법
ES6에서 도입 된 화살표 함수는 function 키워드 대신 화살표를 사용해 보다 간략하게 함수를 선언하는 방법이다.
- 화살표 함수는 항상 익명함수로 정의하며 본문이 한 줄인 함수를 작성할 때 유용하다.
var message;
// 기존 function 정의
message = function() {
return 'hello world!';
};
console.log(message()); //hello world!
// function 키워드 생략
message = () => {
return 'Arrow Function!';
};
console.log(message()); //Arrow Function!
-명령문이 하나만 있을 경우 중괄호 생략 가능
-함수 몸체 내부의 문이 값으로 평가 될 수 있는 표현식인 문이라면 암묵적으로 반환(return 생략 가능)
message = () => 'Arrow Functions are simple!';
- 매개 변수가 있을 경우
message = (val1, val2) => 'Arrow ' + val1 + val2;
console.log(message('Function', '!'));
//Arrow Function!
- 매개변수가 하나이면 소괄호를 생략
매개변수가 없거나 여러 개일 경우 생략 불가
message = val1 => "Arrow " + val;
console.log(message('Functions are GOOD!!!'));
//Arrow Functions are GOOD!!!
즉시 실행 함수
함수 정의와 동시와 즉시 호출이 되는 함수로 단 한번만 호출 되며 다시 호출할 수 없다.
즉시 실행 함수는 반드시 () - 그룹 연산자로 감싸야 한다.
- 함수 이름이 없는 익명 함수를 사용하는 것이 일반적이다.
(function() {
console.log('익명 즉시 실행함수! 함수 정의와 동시에 호출!' )
})();
- 이름을 지어도 다시 호출할 수 없기에 의미가 없다.
(function hello(name){ -> 매개변수
console.log('기명 즉시 실행함수! 함수 정의와 동시에 호출!');
console.log(`${name}님 안녕하세요`);
})('홍길동'); -> 전달값
hello('유관순'); // ReferenceError: hello is not defined
//출력
기명 즉시 실행함수! 함수 정의와 동시에 호출!
홍길동님 안녕하세요
즉시 실행 함수 용도
: 즉시 실행 함수 내에 코드를 모아두면 밖에 있는 코드들과 영역을 분리하여 혹시 있을수도 있는 변수나 함수의 이름 충돌을 방지할 수 있다.
재귀 함수
함수가 자기 자신을 호출하는 것을 재귀 호출이라고 한다.
이러한 재귀 호출을 수행하는 함수인 재귀 함수는 반복되는 처리를 위해 사용한다.
- 팩토리얼(n! = 1 * 2 * ... * (n-1) * n;)을 재귀함수로 표현할 경우
function factorial(n) {
//n이 1 이하일 때 1을 반환하여 반복을 멈춤
if(n <= 1) return 1;
return n * factorial(n-1); //재귀 호출
}
-> 재귀 함수로 표현하는 것이 직관적인 경우 사용, 잘못 사용하면 스택오버플로우 현상이 발생할 수 있으므로 남용X
중첩 함수
함수 내부에 정의 된 함수를 중첩 함수 또는 내부 함수라고 한다.
- 중첩 함수를 포함하는 함수는 외부 함수라고 한다.
- 외부 함수의 변수를 내부 함수에서 참조할 수 있다.
- 일반적으로 중첩 함수는 자신을 포함하는 외부 함수를 돕는 헬퍼 함수의 역할을 한다.
function outer () {
var outerVal = '외부 함수';
function inner () {
var innerVal = '내부 함수';
console.log(outerVal + ", " + innerVal);
}
inner(); //내부 함수를 호출해야 내부 함수의 동작을 가져다 쓴다. 출력 가능
}
outer(); // 출력불가. outer 함수 선언만 읽혀진다.
inner(); // outer 안에서 동작하는 함수이기 때문에 인식 안됨.
// 출력
외부 함수, 내부 함수
콜백 함수
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라고 한다.
- 매개변수를 통해 함수의 외부에서 콜백 함수를 전달 받은 함수를 고차 함수라고 한다.
- 콜백 함수는 고차 함수에 전달 되어 헬퍼 함수의 역할을 한다.
// 전달 받는 값을 증가 시켜주는 함수
function increase(value) {
return value + 1;
}
// 전달 받는 값을 감소 시켜주는 함수
function decrease(value) {
return value - 1;
}
- 고차 함수는 매개변수를 통해 전달 받은 콜백 함수의 호출 시점을 결정해서 호출한다.
- 콜백 함수는 고차 함수에 의해 호출 되며 이 때 고차 함수는 필요에 따라 콜백 함수에 인수를 전달할 수 있다.
// 전달 받은 함수에 전달 받은 값을 적용 시켜주는 고차 함수
function apply(func, value) {
return func(value);
}
// 고차 함수로 콜백 함수를 전달하며 호출한다.
console.log(apply(increase, 5)); // 6
console.log(apply(decrease, 5)); // 4
- 콜백 함수가 고차 함수 내부에서만 호출 된다면 콜백 함수를 익명 함수 리터럴로 정의하면서 바로 고차 함수에 전달하는 것이 일반적이다.
console.log(apply(function(value){ return value + 1;}, 10)); // 11 -> 함수명 생략
console.log(apply(value => value -1, 10)); // 9 -> function 생략, 중괄호, 리턴 생략
- 함수의 변하지 않는 공통 로직은 미리 정의해두고 경우에 따라 변경 되는 로직은 추상화해서 함수의 외부에서 내부로 전달하는 방식이다.
- 콜백 함수는 비동기 처리(이벤트, 타이머, ajax)에서 활용 되는 중요한 패턴이며 배열 고차 함수에서도 사용 된다.
* 참고
배열은 대괄호[]
sort() 함수는 배열을 정렬하는 함수. 정렬 기준을 전달 받는다.sort() 함수는 고차 함수, 정렬기준 함수는 콜백 함수이다.
console.log([3, 1, 4, 2, 5].sort((left, right) => right - left));
-> 양수가 반환되면 순서를 바꾼다. 역순으로 정렬됨 [5, 4, 3, 2, 1]
순수함수와 비순수함수
순수 함수 : 외부 상태에 의존하지도 않고 변경하지도 않는 함수
비순수 함수 : 외부 상태에 의존하거나 외부 상태를 변경하는 함수
-> 함수 외부 상태의 변경을 지양하는 순수 함수를 사용하는 것이 좋다.
- 순수 함수는 최소 하나 이상의 인수를 전달 받으며 인수의 불변성을 유지한다.
var cnt = 0;
function increase(n) {
return ++n;
}
- 순수 함수가 반환한 결과 값을 변수에 재할당해서 상태를 변경한다.
cnt = increase(cnt);
console.log(cnt); // cnt 는 1이 출력된다
- 비순수 함수는 외부 상태에 의존하며 외부 상태를 변경한다.
function decrease() {
return --cnt;
}
- 비순수 함수는 외부 상태(cnt)를 변경하므로 상태 변화를 추적하기 어려워진다.
-> 함수는 input을 받아서 연산한 값을 반환하는 형태가 좋다.
decrease(); // --cnt로 변경
console.log(cnt); // 0
'LECTURE > JavaScript' 카테고리의 다른 글
Object 생성자 함수 (0) | 2023.02.08 |
---|---|
scope - 전역과 지역 스코프, 함수 레벨 스코프, var/let/const (0) | 2023.02.07 |
Function - 함수의 표현식, 함수 호이스팅, 매개변수와 인수, 반환문, 일급 객체 (0) | 2023.02.07 |
Object literal - ES6 , in 연산자, for in 반복문 (0) | 2023.02.07 |
Object leteral - 객체, 프로퍼티, 메소드 (0) | 2023.02.07 |