상세 컨텐츠

본문 제목

[모던 자바스크립트] 12장 함수

모던 자바스크립트

by penloo 2024. 4. 17. 16:32

본문

 

자바스크립트의 주인공 "함수"등장!

 

 

함수는 스코프, 실행 컨텍스트, 클로저, 생성자 함수에 의한 객체 생성, 메서드 등 모두 함수와 깊은 연관을 가지고 있다.

 

수학의 함수는 입력을 받아 출력을 내보내는 일련의 과정을 정의한 것이다.
프로그래밍 언어의 함수도 수학의 함수와 같은 개념이다.
f(x,y) = x + y를 자바스크립트의 함수로 표현해 보자

 

// f(x+y) = x + y
function add(x,y){
 return x + y;
}
add(2,5);

//f(2,5) = 7

프로그래밍 언어의 함수는 일련의 과정을 문(statement)으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다.
함수는 아래 3가지로 이루어져 있다.

  • 매개변수 parameter  -> function add( x , y )
  • 인수 argument  -> add ( 2 , 5 )
  • 반환값 return value -> return x+y

함수는 함수정의로 만들어지고, 인수를 매개변수에 전달해야만이 함수가 실행된다. 이것을 우린 함수 호출이라고 한다

 

//1.함수를 정의한다

function add(x , y) {
   return x = y ;
 }



//2. 함수를 호출하기 위해 매개변수에 넣을 인수를 입력한다

var result = add(2,5);

console.log(result); // 7

 

2 . 함수를 사용하는 이유

  • 필요할 때 여러번 호출가능, 언제나 사용 가능
  • 한번 작성하여 정의한 코드를 재사용하여 유용
  • 코드의 중복을 배제하여 실수를 줄일 수 있으며 중복을 피해 유지보수 및 편의성을 높임
  • 코드의 신뢰성을 높임
  • 코드의 가독성을 향상

3. 함수 리터럴

 

리터럴은 앞에서 봤듯이, 사용자가 알아볼 수 있는 기호와 숫자를 사요왜 값을 생성하기 위한 표현식이다

 

함수 리터럴의 구성은 function키워드, 매개변수 목록, 함수 본체 ,함수 이름로 이루어져있다.

 

구성요소 설명
함수 이름 - 함수 이름은 식별자다
- 함수이름은 함수 몸체 내에서만 참조할 수 있는 식별자다.
- 함수 이름은 생략할 수 있다.(익명함수)
매개 변수 목록 - 0개 이상의 매개변수를 소괄호로 감싸고 쉼표로 구분
- 각 매개변수에는 함수를 호출할 때 지정한 인수가 순서대로 할당된다.
- 매개변수는 함수 몸체 내에서 변수와 동일, 식별자 네이밍 규칙을 준수 해야한다.
함수 몸체 - 함수가 호출되었을 때 실행될 문들을 하나의 실행 단위로 정의한 코드 블록
- 함수 호출에 의해 실행된다.

 

함수 리터럴은 값을 생성하기 위한 표기법이다.
함수 리터럴은 평가되어 값을 생성하고, 이 값은 객체다.
즉, 함수는 객체다.

 

하지만 함수와 일반 객체는 다르다.
일반 객체는 호출할 수 없지만, 함수는 호출할 수 있다.

 

4. 함수정의 

 

함수 정의란 함수를 호출하기 이전에 인수를 전달받을 매개변수와 실행할 문들, 그리고 반환할 값을 지정하는 것을 말한다.
정의된 함수는 평가되어 함수 객체가 된다.

 

 

함수 정의  방식예시
함수 선언문 function add(x,y){
return x+y;
}
함수 표현식 var add = function(x,y){
return x+y;
};
Function 생성자 함수 var add = new Function('x','y','x+y');
화살표 함수(ES6) var add = (x,y)=>x+y

 

4.1 함수선언문

// 함수 선언문
function add(x, y) {
  return x + y;
}

// 함수 참조
// console.dir은 console.log와는 달리 함수 객체의 프로퍼티까지 출력한다.
// 단, Node.js 환경에서는 console.log와 같은 결과가 출력된다.
console.dir(add); // ƒ add(x, y)

// 함수 호출
console.log(add(2, 5)); // 7

 

함수 선언문은 함수이름을 생략할 수 있다

 

함수 선언문은 표현식이 아닌 문이기에 함수를 호출하지 않으면 undefined가 출력된다.

// 함수 선언문은 표현식이 아닌 문이므로 변수에 할당할 수 없다.
// 하지만 함수 선언문이 변수에 할당되는 것처럼 보인다.
var add = function add(x, y) {
  return x + y;
};

// 함수 호출
console.log(add(2, 5)); // 7

 

위 예제는 함수 선언문을 변수에 할당하는 것처럼 보이는데, 사실 객체 리터럴 즉, 함수 표현식으로 해석한다.
자바스크립트 엔진은 코드의 문맥에 따라 해석하는데,
예를들어, 코드블록{ }은 두가지 의미가 있는데 코드 블록일 수도 있고 객체 리터럴일 수도 있다.(중의적 표현)
{ }이 값으로 평가되어야 할 문맥(예, 할당연산자의 우변)에서 피연산자로 사용되면 엔진은 { }을 객체 리터럴로 해석한다.

 

함수 리터럴도 마찬가지로 중의적인 코드이다.
함수 이름이 있는 함수 리터럴을 단독으로 사용하면(변수 할당X) 함수 선언문으로 해석하고, 함수 리터럴을 변수에 할당하거나 피연산자로 사용하면 함수 리터럴 표현식으로 해석한다.
위 예제는 좌변의 변수에 할당 연산자를 통해 우변의 함수 선언문이 피연산자로 사용되면서 자바스크립트 엔진은 { }를 객체 리터럴로 해석한다.

 

4.2 함수 표현식

  • 자바스크립트의 함수는 값처럼 변수에 할당할 수도 있고 프로퍼티 값이 될 수도 있으며 배열의 요소가 될 수도 있다. 이처럼 값의 성질을 갖는 객체를 일급 객체라 한다. 자바스크립트의 함수는 일급 객체다.
  • 함수가 일급 객체라는 것은 함수를 값처럼 자유롭게 사용할 수 있다는 의미다.
// 함수 표현식 
var add = function add(x, y) {
	return x + y;
};

console.log(add(2, 5)); // 7
// 기명 함수 표현식
var add = function foo (x, y) {
	return x + y;
}

// 함수 객체를 가리키는 식별자로 호출
console.log(add(2, 5)); // 7

// 함수 이름으로 호출하면 ReferenceError가 발생한다.
// 함수 이름은 함수 몸체 내부에서만 유효한 식별자다.
console.log(foo(2, 5)); // ReferenceError: foo is not defined
  • 함수 선언문은 ‘표현식이 아닌 문’이고 함수 표현식은 ‘표현식인 문’이다. 따라서 미묘하지만 중요한 차이가 있다.

4.4 Function 생성자 함수

var add = new Function('x', 'y', 'return x+y');

console.log(add(2, 5));  // 7
  • Function 생성자 함수로 함수를 생성하는 방식은 일반적이지 않으며 바람직하지도 않다.
    • 클로저를 생성하지 않는다.

4.5 화살표 함수

  • ES6에서 도입된 화살표 함수는 function 키워드 대신 화살표를 사용해 좀 더 간략한 방법으로 함수를 선언할 수 있다. 화살표 함수는 항상 익명 함수로 정의한다.
    • 표현만 간략한 것이 아니라 내부 동작 또한 간략화되어 있다.
// 화살표 함수 
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7

관련글 더보기