프로그래밍 언어의 함수는 일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다.
함수 내부로 입력을 전달받는 변수 = 매개변수
입력 = 인수
출력 = 반환값
함수이름 = 식별자
function name<함수이름 (x,y) <매개변수 {
return x + y; <반환값
}
name(2,5 );< 인수
함수는 함수 정의를 통해 생성, 함수호출을 통해 실행한다.
같은코드를 여러번 다시 쓸수없으니까 정의된 함수를 통해 재사용하는것이 효율적이다.
함수를 통해 코드의 신뢰성과 가독성을 향상시킨다.
JS의 함수는 객체타입의 값이다.
함수를 정의하는 방법 4가지
1. 함수 선언문
2. 함수 표현식
3. Function 생성자 함수
4. 화살표 함수
1. 함수 선언문
표현식이 아닌 문은 변수에 할당할수없다.
var add = function add(x,y) {
return x + y;
};
하지만 이 경우는 함수에 변수를 할당했는데 바로 { } 때문이다.
{ } 는 중의적 표현이기때문에 코드의 맥락에 따라 해석이 달라진다.
값으로 평가 되어야할 문맥에서 피연산자로 사용하면 객체 리터럴로 해석한다.
function FC() { console.log('FC'); }
FC(); // FC --> 잘작동함 ( 함수 선언문)
(function CB() { console.log('CB');});
CB(); // ReferenceError --> 작동안함 (함수 리터럴 표현식)
함수리터럴식이 안되는 이유: 함수 몸체 외부에서는 함수이름으로 함수를 참조 할수없어서.
함수를 가리키는 식별자가 없다는 뜻.
함수 선언문이 되는 이유: 함수리터럴식과 똑같이 내부에서만 유효한 이름인데 이건 됨. 왜냐면 JS엔진이 암묵적으로 식별자를 생성하기 때문. 생성된 함수를 호출하기위해 함수이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당함.
함수는 함수이름으로 호출하는것이 아니라, 함수 객체를 가리키는 식별자로 호출한다.
함수 선언문으로 정의한 함수를 함수 표현식으로 바꿔서 정의하면
var add = function (x,y) {
return x + y; };
console.log(add(2,5)); // 7
함수리터럴의 함수이름은 일반적으로 생략함. 이를 익명함수라고 함
함수 선언문은 호이스팅(위로 끌어올려 쓰기) 가능,
함수 표현식은 호이스팅 불가능.
-> 함수 표현식 사용 권장..?
3. Function 생성자 함수
기본제공 Function 생성자 함수에 매개변수 목록과 함수 몸체를 문자열로 전달하면서 new 연산자와 함께 호출하면 함수 객체를 생성해서 반환한다. 근데 new 연산자 없이 호출해도 결과는 동일ㅋ
var add = new Function('x', 'y', 'return x + y');
console.log(add(2,5)); // 7
--> 일반적이지도 않고 바람직하지도 않대 ㅋ;
4. 화살표 함수.
const add = (x,y) => x + y;
console.log(add(2,5)); // 7
함수호출
함수는 함수를 가리키는 식별자와 한쌍의 소괄호인 함수 호출 연산자로 호출함.
함수 호출 연산자 내에는 0개이상의 인수를 쉼표로 구분해서 나열한다.
함수를 호출하면 현재의 실행 흐름을 중단하고 호출된 함수로 실행 흐름을 옮긴다.
이때 매개변수에 인수가 순서대로 할당되고 함수 문들이 실행되기 시작한다.
매개 변수를 통해 인수를 전달함.
인수는 함수를 호출할 때 지정, 개수와 타입은 상관X
매개변수는 함수를 정의할 때 선언, 매개변수의 유효범위는 함수 내부이다.
매개변수보다 인수가 많은경우에는 초과된 인수는 무시됨.
무시된건 버려지는건 아니고 arguments 객체의 프로퍼티에 보관됨
매개변수의 최대개수는 제한하고 있지 않지만 가급적 작게 만들어야함.
반환문
return 반환문을 사용해 실행결과를 함수 외부로 반환할수있따.
반환문의 역할
1. 함수의 실행을 중단하고 함수 몸체를 빠져나간다. / 반환문 이후에 다른문이 존재하면 그냥 무시됨
2. return 키워드 뒤에 오는 표현식을 평가해 반환한다.
return 뒤 표현식사이에 줄바꿈이 있으면 세미콜론 자동 삽입 기능에 의해서 줄바뀐 표현식은 무시됨
반환문은 함수 몸체 내부에서만 사용가능.
참조에 의한 전달과 외부상태 변경 << (잘모르게꽁~ 다음에 ㅋ...)
다양한 함수의 형태
1. 즉시 실행함수
: 단 한번만 호출되며 다시 호출할 수 없다.
(function () {
var a = 3;
var b = 5;
return a * b;
}());
즉시 실행함수는 함수이름이 없는 익명함수를 사용하는게 일반적.
즉시 실행함수는 반드시 그룹연산자 (...)로 감싸야 한다.
function foo () {} ();
2. 재귀함수
자기 자신을 호출하는 함수.
function countdown(n) {
if ( n < 0) return;
console.log(n);
countdown(n-1); // 재귀호출
}
countdown(10);
반복문없이 재귀함수로 반복처리 가능?!?
'JavaScript' 카테고리의 다른 글
[15장] let,const, 블록 레벨 스코프 (0) | 2022.02.25 |
---|---|
[13장, 14장] 스코프 , 전역변수의 문제점 (0) | 2022.02.25 |
[10장] 객체 리터럴 (0) | 2022.02.17 |
[8장, 9장] 제어문 , 타입변환과 단축평가 (0) | 2022.02.17 |
[6장, 7장] 데이터타입, 연산자 (1) | 2022.02.15 |