자바스크립트의 주인공 "함수"등장!
함수는 스코프, 실행 컨텍스트, 클로저, 생성자 함수에 의한 객체 생성, 메서드 등 모두 함수와 깊은 연관을 가지고 있다.
수학의 함수는 입력을 받아 출력을 내보내는 일련의 과정을 정의한 것이다.
프로그래밍 언어의 함수도 수학의 함수와 같은 개념이다.
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가지로 이루어져 있다.
함수는 함수정의로 만들어지고, 인수를 매개변수에 전달해야만이 함수가 실행된다. 이것을 우린 함수 호출이라고 한다
//1.함수를 정의한다
function add(x , y) {
return x = y ;
}
//2. 함수를 호출하기 위해 매개변수에 넣을 인수를 입력한다
var result = add(2,5);
console.log(result); // 7
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) 함수 선언문으로 해석하고, 함수 리터럴을 변수에 할당하거나 피연산자로 사용하면 함수 리터럴 표현식으로 해석한다.
위 예제는 좌변의 변수에 할당 연산자를 통해 우변의 함수 선언문이 피연산자로 사용되면서 자바스크립트 엔진은 { }를 객체 리터럴로 해석한다.
// 함수 표현식
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
var add = new Function('x', 'y', 'return x+y');
console.log(add(2, 5)); // 7
// 화살표 함수
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7
[모던 자바스크립트] 17장 생성자 함수에 의한 객체 (0) | 2024.05.15 |
---|---|
[모던 자바스크립트] 15장 let, const 키워드와 블록 레벨 스코프 (0) | 2024.05.08 |
[모던 자바스크립트] 10장 객체 리터널 (0) | 2024.04.09 |
[모던 자바스크립트] 7장 연산자 (2) | 2024.04.02 |
[모던자바스크립트] 6장 데이터 타입 (0) | 2024.03.28 |