function문은 자바스크립트 함수를 정의하는데 쓰인다.
문법은 다음과 같다.
'함수 이름'은 정의할 함수의 이름이다. 이는 반드시 문자열이나 표현식이 아닌 식별자이어야만 한다.
함수 이름 다음에는 괄호 속에 쉼표로 구분된 전달인자 이름들의 목록이 따라온다.
함수가 호출되면 함수 몸체 내부에서 전달인자 값들을 참조하기 위해 이 식별자들(전달인자 이름들)이
쓰인다.
함수의 몸체는 임의 개수의 자바스크립트 문잔들도 구성되며 중괄호를 사용하여 이 문장들을 묶는다.
이 문장들은 함수가 정의될 때 실행되는 것이 아니다. 함수 실행 연산자 ()에 의한 함수 호출로 이 함수가
컴파일되고 실행될 수 있는 형태의 새로운 함수 객체와 연결되었을 때에 비로소 이 문장들이 실행된다.
또한 function 문에는 중괄호가 필수 사항으로 들어있음을 주목하라. while 루프나 기타 문장에서 사용되는
문장 블록과는 달리 함수 몸체에는 중괄호가 반드시 필요하다. 심지어 함수 몸체가 단 하나의 문장만으로
구성되어 있더라도 예외가 아니다.
함수를 정의하면 새로운 함수 객체를 정의한 후, '함수 이름'으로 명명된 새로 생긴 프로퍼티에 이 함수 객체를 저장한다. 아래에 함수를 정의하는 몇 가지 에제가 있다.
function print(msg) {
function hypotenuse(x, y) {
function factorial(n) { // 재귀 함수
return n * factorial(n - 1);
함수 정의는 자바스크립트의 최상위 단계 코드에서 나타나는 것이 보통이다. 함수 정의를 다른 함수 정의
속에 중첩시킬 수도 있다. 하지만 다른 함수 속에 중첩시킬 때에도 바깥 함수의 최상위 단계에 중첩시킬
함수 정의가 위치해야 한다. if 문, while문, 기타 문장 속에는 함수 정의가 위치할 수 없다.
원칙적으로 말하면 function 문은 문장이 아니다. 자바스크립트 프로그램에서 문장은 무언가 동적인 행위를 일으켜야 한다. 하지만 함수 정의는 프로그램의 정적인 구조를 나타낼 뿐이다. 문장은 실행 시간에 실행되는 반면 함수는 자바스크립트 코드가 실제로 실행되기 이전의 파싱(parsing) 또는 컴파일 단계에서 이루는 문장들을 파싱하고 저장한다(실행하지는 않는다). 그러고 나서 이 함수를 유지할 프로퍼티를 이 함수와 동일한 이름으로 정의한다. (이 함수 정의가 다은 함수 안에 중첩되어 있다면 호출 객체에 프로퍼티를 정의하며, 그렇지 않다면 전역 객체에 정의한다)
함수 정의가 실행 시간에 일어나지 않고 코드를 파싱할 때 일어난다는 점으로 인해 종종 놀라운 효과가 일어나곤 한다. 다음의 코드를 살펴보자.
var f = 0; // 이 문장은 프로퍼티 f를 덮어써버린다.
function f(x) { // 이 '문장'은 위 문장들의 실행에 앞서
alert(f); // 0을 표시한다. 변수 f가 함수 f()를 덮어써버렸다.
위와 같은 신기한 결과가 발생하는 이유는 함수 정의와 변수 정의가 서로 다른 시점에 일어나기 때문인데,
다행스럽게도 위와 같은 상황은 그리 자주 일어나지 않는다. 함수에 대해서는 8장에서 더 배운다.
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 6.16 throw (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 6.15 return (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 6.13 var (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 6.12 continue (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 6.11 break (0) | 2010.07.04 |