
자바스크립트 학습의 바이블이라 할 수 있는 "모던 자바스크립트 Deep Dive"를 요약 정리하여, 이미 알고 있는 내용과 새롭게 알게 된 내용을 통해 자바스크립트의 기본기를 탄탄히 다지고자 합니다.
프로그래밍 언어의 함수는 일련의 과정의 문(statement)으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것
- 함수 내부로 입력을 전달받는 변수를 매개변수(parameter)
- 입력을 인수(argument)
- 출력을 반환값(return value)
function add(x, y) {
return x + y;
}
add(2, 5); // 7
함수 리터럴은 fucntion 키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성된다.
| 구성 요소 | 설명 |
|---|---|
| 함수 이름 | - 함수 이름은 식별자이기 때문에 식별자 네이밍 규칙을 준수해야함 |
함수 리터럴도 평가되어 값을 생성하며, 이 값은 객체임 ⇒ 함수는 객체다
| 차이점 | 함수 | 일반 객체 |
|---|---|---|
| 호출 가능 여부 | 호출 가능 | 호출 불가능 |
| 고유 프로퍼티 | 고유 프로퍼티 가짐 | 고유 프로퍼티 안 가짐 |
함수를 호출하기 이전에 인수를 전달받을 매개변수와 실행할 문들, 그리고 반환할 값을 지정하는 것을 뜻함
function add(x, y) {
return x + y;
}let add = function(x, y) {
return x + y;
};let add = new Function('x', 'y', 'return x + y');let add = (x, y) => x + y; 📄 변수 선언과 함수 정의
함수 선언문이 평가되면 식별자가 암묵적으로 생성되고 함수 객체가 할당됨
따라서 변수에는 선언, 함수에는 정의라고 표현
함수 선언문은 함수 리터럴과 형태가 동일하지만, 차이점은 함수 선언문은 함수 이름을 생략할 수 없음
함수 선언문은 표현식이 아닌 문임
let add = function add(x, y) {
return x + y;
}
console.log(add(2, 5));
본래, 표현식이 아닌문은 변수에 할당할 수 없기 때문에 함수 선언문도 변수에 할당할 수 없다. 하지만, 위의 예제 코드를 보면 함수 선언문이 변수에 할당되는 것이 보임
자바스크립트 함수는 일급 객체이므로 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있음
→ 함수 표현식
📄 일급 객체란? 값의 성질을 갖는 객체를 뜻함
let add = function foo(x, y) {
return x + y;
}
// 함수 객체를 가리키는 식별자로 호출
console.log(add(2, 5)); // 7
함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점은 다르다.
// 함수 참조
console.dir(add); // f add(x, y)
console.dir(sub); // undefined
// 함수 호출
console.log(add(2, 5)); // 7
// 함수 선언문
function add(x, y) {
return x + y;
}
// 함수 표현식
let sub = function(x, y){
return x - y;
}
함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유 특징
| 비교 | 함수 호이스팅 | 변수 호이스팅 |
|---|---|---|
| 공통점 | 런타임 이전에 엔진에 의해 실행됨(함수 선언문) | 런타임 이전에 엔진에 의해 실행(변수 선언문) |
| 차이점 | 암묵적으로 생성된 식별자는 함수 객체로 초기화 | undefined로 초기화 |
⇒ 함수 선언문으로 정의한 함수를 함수 선언문 이전에 호출하면 함수 호이스팅에 의해 호출 가능함
빌트인 함수 Function 생성자 함수에 매개변수 목록과 함수 몸체를 문자열로 전달하면서 new 연산자와 함께 호출하면 함수 객체 생성해서 반환함
📄 생성자 함수: 객체를 생성하는 함수
let add = new Function('x', 'y', 'return x + y');
console.log(add(2, 7)) // 9
ES6에서 도입된 화살표 함수는 function 키워드 대신 화살표를 사용해 좀 더 간략한 방법으로 함수 선언
const add = (a, b) => a + b;
function add(x, y) {
return x + y;
}
console.log(add(2, 5, 10)); ?
function multiply(x, y) {
return x + y;
}}
// 함수 호출은 반환값
var result = multiply(3, 5);
console.log(result);
function change((primitive, obj)}
c2 += 100;
obj.name = {'kat'}
}
함수 정의와 동시에 즉시 호출되는 함수
- 한 번만 호출되며 다시 호출할 수 없음
- 함수 이름이 없는 익명 함수를 사용하는 것이 일반적임
자기 자신을 호출하는 행위, 재귀 호출을 수행한 함수
- 재귀 함수는 자기 자신을 무한 재귀 호출하기 때문에 탈출 조건을 반드시 만들어야 함
- 반복되는 처리를 반복문 없이 구현할 수 있다 (장점)
- 무한 반복에 빠질 위험이 있고, 스택 오버플로 에러를 발생시킬 수 있음
합수 내부에 정의된 함수를 중첩 함수라고 부름
- 중첩 만수는 외부 함수 내에서만 호출함
함수의 매개변수를 통해 다른 함수의 내부로 전달된 함수를 콜백함수라고 한대
매개변수 분술르 통해 외부에ㅓㅅ 쿨백 전달받은 함수는 고차함수라고 함