JavaScript 함수의 기초
자바스크립트에서도 C언어나 JAVA에서처럼 함수가 존재한다.
함수는 일반적으로 다음과 같이 생겼다.
1 2 3 4 5 6 | function 함수명(n) { 함수 몸통 return 값 (없을수도 있음); } | cs |
이처럼 함수를 정의하는 것을 함수 선언문으로 함수를 정의했다고 한다.
간단한 예로 팩토리얼 함수를 자바스크립트로 표기해보자면,
1 2 3 4 | function fact(n) { if (n <= 1) return n; return n * fact(n - 1); } | cs |
함수 선언문으로 함수를 정의하면 끌어올림이 가능한데 이 말이 무슨 뜻이냐면
다음 예제를 보며 설명하겠다.
다음과 같이 함수를 정의하기 전에 함수를 실행하는 코드(console.log(fact(n));)가 먼저 쓰여도 문제없이 동작한다.
또한 함수는 원시 값이 인수일 때와 객체가 인수일 때와 다르게 동작한다.
먼저 원시 값이 인수일 때는
위 함수는 전달받은 인수에 +1을 한 후 반환하는 함수이다.
즉, 인수에 원시 값을 주면 그 값 자체가 인자에 전달, 복사된다.
여기서 변수 a와 인자 n은 별개의 변수이다.
다음으로 인수가 객체일 때 함수의 동작을 살펴보자.
함수가 호출될 때 a의 복사본이 인자 p에 할당된다. 여기까진 위 원시 값일 때와 같다.
그러나 객체 a에 {x:3, y:4};값을 인자 p에 대입시킨다.
즉, 변수 a와 인자 p는 똑같은 객체를 참조하고 있는 것이다.
그리고 위에서는 함수 선언문으로 함수를 정의해 보았는데, 함수 선언문 말고도 함수를 다루는 방법이 또 있다.
다음 방법은 함수 리터럴, 무명 함수로 함수 정의하는 방법이다.
1 | var square = function(x) { return x * x; }; | cs |
모양새만 보면 변수 square에 함수를 대입시킨 모습이다.
실제로 변수에 함수 객체의 참조를 저장시키는 방법이다.
그래서 일반적인 함수 선언문에서는 { ... } 끝에 세미콜론(;)을 붙이지 않았는데 여기서는 붙인 것을 볼 수 있다.
함수 리터럴에도 이름을 붙일 수 있다.
1 | var square = function sq(x) { return x * x; }; | cs |
그러나 sq라는 이름은 함수 안에서만 유효하므로 함수 바깥에서 sq라는 이름으로 호출할 수 없다.
마지막으로 객체의 메소드를 설명하겠다.
자바스크립트에서 메소드는 객체의 프로퍼티 중에서 함수 객체를 값으로 담고 있는 프로퍼티를 메소드라고 부른다.
1 2 3 4 5 6 7 | var circle = { center: { x : 1.0, y : 2.0 }, radius: 2.5, area: function () { return Math.PI * this.radius * this.radius; } }; | cs |
circle객체 안에 원의 넓이를 구하는 프로퍼티인 area가 함수 객체를 값으로 담고 있는 메소드이다.
메소드 또한 프로퍼티의 일종이므로 객체를 생성한 후 나중에 추가할 수 있다.
예를 들어 위 객체 circle에 translate라는 메소드를 추가해 보자면,
1 2 3 4 | circle.translate = function(a, b) { this.center.x = this.center.x + a; this.center.y = this.center.y + b; }; | cs |
프로퍼티를 나중애 추가하는 방법과 동일하다.
다음 포스팅은 생성자에 대하여 포스팅을 하겠다.
< 본 포스팅에 사용된 코드의 출처는 '길벗출판사 - 모던 자바스크립트 입문' 도서입니다. />
'JavaScript' 카테고리의 다른 글
#6 자바스크립트 - 배열 (0) | 2019.03.09 |
---|---|
#5 자바스크립트 - 내장 생성자 (0) | 2019.03.08 |
#4 자바스크립트 - 생성자 (0) | 2019.03.08 |
#2 자바스크립트 변수와 객체 (0) | 2019.03.06 |
#1 자바스크립트 기본 (Hello World!) (0) | 2019.03.06 |