ES6 이전의 함수는
함수의 사용 목적에 따라 명확히 구분되지 않는다.
- 모든 함수는 일반 함수로서 호출할 수 있는 것은 물론 생성자 함수로서도 호출할 수 있다.
- 메서드(객체에 바인딩 된 함수)도 일반함수로 호출 가능, 생성자함수로도 호출 가능
프로토타입 객체도 생성할 수 있다. - 콜백함수(함수에 전달되는 보조함수의 역할)도 프로토타입 객체 생성할 수 있다
=> 불필요한 프로토타입 객체를 생성하고, 성능에도 좋지 않다.
ES6 부터는
함수의 목적에 따라 세 가지 종류로 명확히 구분했다.
- 일반함수는 선언문이나 함수 표현식으로 정의한 함수를 뜻하고, 생성자 함수로 호출 가능하다.
- 메서드와 화살표 함수는 일반함수로만 호출 가능하고, 생성자 함수로는 호출이 불가하다.
메서드
메서드(객체에 바인딩 된 함수)는 메서드 축약 표현으로 정의된 함수만을 의미한다.
화살표함수
function키워드 대신 화살표 ( =>, { } ) 를 사용해 기존의 함수보다 간략하게 함수를 정의할 수 있다.
- 매개변수 선언
//매개변수가 여러 개인 경우, 소괄호 () 안에 매개변수를 선언한다
const arrow = (x, y) => {...};
//매개변수가 한 개인 경우, 소괄호 ()를 생략할 수 있다
const arrow = x => {...};
//매개변수가 없는 경우, 소괄호 ()를 생략할 수 없다
const arrow = () => {...};
- 함수 몸체 정의
// 함수 몸체가 값으로 평가될 수 있는 문으로 구성된다면 {}는 생략할 수 있다.
const power = x => x ** 2 power(2); //4
// 표현식이 아닌 문은 {}생략이 불가하다.
const arrow = () => const x = 1; // SyntaxError
const arrow = () => { const x = 1; }; // 가능
// 객체 리터럴을 반환하는 경우에는 ()소괄호로 감싸줘야 한다
const create = (id, content) => {(id, content)};
create(2, 'javascript') // {id: 2, content: 'javascript'}
// 함수 몸체가 여러개의 문으로 구성된다면 {}중괄호를 생략할 수 없다.
// 이때 반환값이 있다면 명시적으로 반환해야 한다
const sum (a, b) => {
const result = a + b;
return result;
}
// 화살표 함수도 일급객체이므로 map, reduce, filter와 같은 고차함수의 인수로 전달할 수 있다.
[1,2,3].map( v => v * 2); // [2, 4, 6]
화살표함수와 일반함수의 차이
- 화살표함수는 생성자 함수로 호출할 수 없다. = 인스턴스를 생성할 수 없다.
- 화살표 함수는 중복된 매개변수 이름을 선언하면 에러가 발생한다
- 화살표 함수는 함수 자체 this와 같은 바인딩을 갖지 않는다
Rest 파라미터(나머지 매개변수)
Rest파라미터(나머지 매개변수)는 매개변수 이름 앞에 세 개의 점 ...을 붙여서 정의한 매개변수를 의미한다. Rest파라미터틑 함수에 전달된 인수들의 목록을 배열로 받는다.
function foo(...rest){
console.log(rest); // 결과값 : [1, 2, 3, 4, 5]
}
foo(1,2,3,4,5)
Rest파라미터는 일반 매개변수와 함께 사용할 수 있다. 이때 함수에 전달된 인수들은 매개변수와 Rest 파라미터에 순차적으로 할당된다.
function foo(param, ...rest){
console.log(param); // 결과값 : 1
console.log(rest); // 결과값 : [2, 3, 4, 5]
}
foo(1,2,3,4,5)
매개변수의 기본값
함수를 호출할 때 매개변수의 개수만큼 인수를 전달하는 것이 맞지만, 숫자가 맞지 않아도 에러는 나지 않는다.
자바스크립트 엔진은 매개변수와 인수의 개수를 체크하지 않기 때문이다.
인수와 매개변수의 개수가 맞지 않을 때, 인수가 전달되지 않은 매개변수의 값은 undefined이다.
그렇기 때문에 아래의 코드에서 1 + undefined의 연산의 결과로 NaN이 나온 것이다.
function sum( x, y ){
return x + y;
}
console.log(sum(1)); // NaN
// 1 + undefined = NaN
이런 문제를 해결하기 위해서 매개변수에 인수값이 전달되지 않았을 경우 기본값을 할당해야 할 필요가 있다.
- (1) x,y의 값이 있으면 그대로 사용하고 없으면 0을 넣어주는 코드를 미리 추가하거나,
- (2) 매개변수를 넣는 자리에 아예 기본값을 넣어두면 함수 내에서 인수 체크를 따로 해 주지 않아도 된다.
// (1)
function sum( x, y ){
x = x || 0;
y = y || 0;
return x + y;
}
// (2)
function sum( x = 0, y = 0 ){
return x + y;
}
// 1,2번의 코드 모두 결과값은 같다
console.log(sum(1)); // 1
console.log(sum(1,2)); // 3
'개발공부_Blog > JavaScript' 카테고리의 다른 글
Array. 추가 메서드 [ push, unshift, concat, splice ] (0) | 2022.10.06 |
---|---|
Array객체 (0) | 2022.10.05 |
실행컨텍스트 - 자바스크립트 동작원리 (0) | 2022.10.01 |
JavaScript의 this는 자기참조변수다! (0) | 2022.09.28 |
Strict mode (엄격모드) (0) | 2022.09.26 |
댓글