[Javascript] function
function, JavaScript function, JS function, 함수 선언, function declaration, function expression, 일반 함수
정의
function 은 JavaScript 에서 함수를 만드는 가장 기본적인 키워드. 호이스팅, this 동적 바인딩, arguments 객체, new 호출 등 arrow function 과 구분되는 고유한 특성을 가진다.
함수가 값 으로 다뤄지는 일급 함수 의 성질은 모든 형태에 공통.
두 가지 모양
함수 선언 (Function Declaration)
function greet(name) {
return `Hello, ${name}`;
}
- 호이스팅 됨 (선언 전 호출 가능)
- 자기 이름
greet으로 자신을 참조 가능 (재귀)
함수 표현식 (Function Expression)
const greet = function (name) {
return `Hello, ${name}`;
};
// 이름 있는 함수 표현식 (named function expression)
const factorial = function fact(n) {
return n <= 1 ? 1 : n * fact(n - 1);
};
- 호이스팅 안 됨 (변수 선언만 호이스팅, 값은 평가 시점에 할당)
- 익명 또는 이름 있음, 이름은 내부에서만 보임
호이스팅의 차이
greet('A'); // 'Hello, A', 함수 선언은 호이스팅
function greet(name) {
return `Hello, ${name}`;
}
sayHi('B'); // TypeError: sayHi is not a function
const sayHi = function (name) {
return `Hi, ${name}`;
};
함수 선언은 함수 자체 가 스코프 최상단으로 끌어올려진다. 표현식은 const/let/var 가 호이스팅되는 규칙을 따른다.
this 동적 바인딩
일반 함수의 가장 큰 특징. 호출 방식에 따라 this 가 결정된다.
| 호출 방식 | this |
|---|---|
일반 호출 fn() | undefined (strict) 또는 전역 객체 |
메서드 호출 obj.fn() | obj |
fn.call(ctx), fn.apply(ctx) | ctx |
fn.bind(ctx)() | ctx |
new fn() | 새 인스턴스 |
| DOM 이벤트 리스너 | 이벤트 타겟 (보통) |
const obj = {
name: 'Alice',
greet() {
console.log(this.name); // 'Alice'
},
};
const fn = obj.greet;
fn(); // undefined, this 가 obj 가 아니다
이 “this 가 호출 시 결정” 특성이 arrow function 과 가장 큰 차이.
arguments 객체
일반 함수 안에는 arguments 라는 유사 배열 객체가 자동으로 존재.
function sum() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
sum(1, 2, 3); // 6
모던 코드에서는
...rest매개변수를 권장.arguments는 배열이 아니라 유사 배열이라.map등이 안 통한다.
new 호출
생성자로 사용 가능. this 는 새 인스턴스를 가리킨다.
function Person(name) {
this.name = name;
}
Person.prototype.greet = function () {
return `Hello, ${this.name}`;
};
const p = new Person('Alice');
p.greet(); // 'Hello, Alice'
ES2015
class문법이 이를 깔끔하게 대체. 그래도 내부적으로는 같은 메커니즘.
프로토타입 체인
일반 함수는 prototype 속성을 가진다 (생성자로 쓰일 수 있어서).
function Animal() {}
Animal.prototype.eat = function () { /* ... */ };
const dog = new Animal();
dog.eat(); // 프로토타입 체인을 따라 찾음
arrow function 은 prototype 이 없어 new 호출 불가.
일반 함수 vs 화살표 함수 비교
| 특성 | function | () => {} |
|---|---|---|
this | 호출 시 결정 (동적) | 정의 시 결정 (lexical) |
arguments | ✓ | ✗ (rest 사용) |
new 호출 | ✓ (생성자 가능) | ✗ (TypeError) |
prototype | ✓ | ✗ |
| 호이스팅 (선언문) | ✓ | ✗ (표현식만 가능) |
| 짧은 문법 | △ | ✓ |
| 메서드로 적합 | ✓ | △ (this 가 lexical 이라서) |
자세한 화살표 함수 동작은 arrow function 참고.
언제 일반 함수를 쓰는가
- 객체의 메서드,
this가 객체를 가리켜야 함 - 생성자,
new와 함께 - prototype 메서드, 클래스 메서드
- 재귀 함수 (이름 있는 표현식 또는 선언문)
참고
이 글의 용어 (5개)
- [Javascript] 클로저javascript
- 정의 클로저 (Closure): 함수가 자신이 정의된 시점의 외부 변수들을 계속 참조할 수 있는 성질. 함수가 일급 객체 () 인 언어의 자연스러운 결과. 메커니즘은 + 함수 객…
- [Javascript] Arrow Functionjavascript
- 정의 화살표 함수 (arrow function) 는 ES2015 (ES6) 에서 도입된 함수 표현식. 모양. 더 짧은 문법뿐 아니라 가 lexical 로 바인딩 되는 본질적 차이…
- [Javascript] Lexical Environmentjavascript
- 정의 Lexical Environment (어휘적 환경) 는 ECMAScript 명세 (§9.1) 가 정의한 내부 객체. 함수가 호출될 때마다 새로 만들어지며, 이 호출의 변수들…
- 고차 함수javascript
- - 고차함수란 하나 이상의 함수를 인자로 받거나 반환하는 함수를 말합니다. - 일급 함수라는 특성을 활용해 실제로 함수를 다루는 연산을 수행하는 함수입니다. 즉, 아래 조건 중 …
- 일급 함수javascript
- - 함수를 값처럼 다루어 변수에 담거나 다른 함수의 인자로 전달하거나 함수의 반환값으로 사용할 수 있는 함수. 일급 함수의 이러한 특성을 활용하여 를 구현할 수 있습니다. - 함…
💬 댓글