SEB Section 1 function
함수란?
- 함수란 어떤 작업을 수행하기 위해 필요한 문들의 집합을 정의한 코드 블록이다.
- 함수는 이름과 매개변수를 갖으며 필요한 때에 호출하여 코드 블록에 담긴 문들을 일괄적으로 실행 할 수 있다.
- 함수는 호출에 의해 실행되는데 한번만 호출할 수 있는 것이 아니라 여러번 호출할 수 있다.
- 동일한 작업을 수행할 때, 미리 정의된 함수를 재사용하는 것이 효율적이다. -> 코드 재사용이라는 측면에서 매우 유용
- 자바스크립트의 함수는 일급 객체이다.
함수 정의
- 함수를 정의하는 방식은 3가지가 있다.
- 함수 선언문
- 함수 표현식
- Function 생성자 함수
함수 선언문
-
함수 선언문 방식으로 정의한 함수는 fucntion 키워드와 이하의 내용으로 구성된다.
- 함수명 함수 선언문의 경우, 함수명은 생략할 수 없다. 함수명은 함수 몸체에서 자신을 재귀적호출 하거나 자바스크립트 디버거가 해당 함수를 구분할 수 있는 식별자이다.
- 매개변수 목록 0개 이상의 목록으로 괄호로 감싸고 콤마로 분리한다. 다른 언어와의 차이점은 매개변수의 타입을 기술하지 않는다는 것이다. 이 때문에 함수 몸체 내에서 매개변수의 타입 체크가 필요할 수 있다.
- 함수 몸체 함수가 호출되었을 때 실행되는 문들의 집합이다. 중괄호({})로 문들을 감싸고 return 문으로 결과값을 반환할 수 있다. 이를 반환값이라 한다.
function square(number) {
return number * number;
}
함수 표현식
-
자바스크립트의 함수는 일급 객체이므로 아래와 같은 특징이 있다.
- 무명의 리터럴로 표현이 가능하다.
- 변수나 객체에 저장할 수 있다.
- 함수의 파라미터로 전달할 수 있다.
- 반환값으로 사용할 수 있다.
- 함수의 일급객체 특성을 이용하여 함수 리터럴 방식으로 함수를 정의하고 변수에 할당할 수 있는데 이러한 방식을 함수 표현식이라 한다.
- 함수 표현식 방식으로 정의한 함수는 함수명을 생략하는 익명 함수로 표현하는 것이 일반적이다.
// 기명 함수 표현식(named function expression)
var foo = function multiply(a, b) {
return a * b;
};
// 익명 함수 표현식(anonymous function expression)
var bar = function (a, b) {
return a * b;
};
console.log(foo(10, 5)); // 50
console.log(multiply(10, 5)); // Uncaught ReferenceError: multiply is not defined
- 함수는 일급 객체이기 때문에 변수를 할당할 수 있는데 이 변수는 함수명이 아니라 할당된 함수를 가리키는 참조값을 저장하게 된다. 함수 호출시 함수명이 아닌 함수를 가리키는 변수명을 사용하여야 한다.
var foo = function (a, b) {
return a * b;
};
var bar = foo;
console.log(foo(10, 10)); // 100
console.log(bar(10, 10)); // 100
- 변수 bar와 변수 foo는 동일한 익명 함수의 참조값을 갖는다.
Function 생성자 함수
- 함수 선언문과 함수 표현식은 모두 함수 리터럴 방식으로 함수를 정의 하는데, 이것은 결국 내장 함수 Function 생성자 함수로 함수를 생성하는 것을 단순화 시킨 축약법이다.
- 일반적으로 잘 사용하지 않는다.
함수 호이스팅
- 함수 선언문으로 선언을 하면 호이스팅이 일어나 선언 위치와 상관 없이 코드 내 어디서든지 호출이 가능하다.
- 함수 표현식으로 선언을 하면 변수 호이스팅이 발생한다.
변수 호이스팅은 변수 생성 및 초기화와 할당이 분리되어 진행된다. 호이스팅된 변수는 undefined로 초기화 되고 실제값의 할당은 할당문에서 이루어진다.
- 함수 호이스팅이 함수 호출 전 반드시 함수를 선언하여야 한다는 규칙을 무시하므로 코드의 구조를 엉성하게 만들 수 있다.
- 따라서 함수 표현식만을 사용하는 것이 좋다.
일급 객체
-
자바스크립트의 함수는 일급 객체이므로 아래와 같은 특징이 있다.
- 무명의 리터럴로 표현이 가능하다.
- 변수나 객체에 저장할 수 있다.
- 함수의 파라미터로 전달할 수 있다.
- 반환값으로 사용할 수 있다.
-
다른 객체와 구분짓는 특징은 호출의 차이이다.
댓글남기기