함수 선언문
function hello(name) {
return `${name}님 안녕하세요.`;
}
함수 호출
console.log(hello('홍길동'));
// 홍길동님 안녕하세요.
함수 표현식
자바스크립트의 함수는 객체 타입의 값으로 값의 성질을 갖는 일급 객체이다.(밑에 설명)
함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있다.
- 함수 표현식에서는 함수명을 생략할 수 있다.
var hello = function (name) {
return `${name}님 안녕하세요`;
}
console.log(hello('홍길동'));
// 홍길동님 안녕하세요
- 함수 표현식에서 함수명을 생략하지 않아도 문제는 없다.
var calc = function add(a,b) {
return a + b;
}
- 단, 함수 호출은 식별자로 이루어지며 함수명으로 호출할 수 없다.
console.log(calc(10, 20));
//console.log(add(10,20));
함수 호이스팅
함수 선언문은 런타임 이전 자비스크립트 엔젠에 의해 먼저 실행된다. 따라서 함수 선언문 이전에 함수를 참조할 수 있고 호출할 수 있다.
함수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 것을 '함수 호이스팅'이라고 한다.
console.log(hello('홍길동'));
console.log(hi('홍길동')); //TypeError: hi is not a function
//함수 선언문
function hello(name) {
return `${name}님 안녕하세요!`;
}
// 함수 표현식
var hi = function(name) {
return `${name} 안녕!`;
}
변수 할당문의 값은 할당문이 시행되는 시점, 즉 런타임에 평가되므로 함수 표현식의 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 된다.
함수 표현식으로 정의한 함수는 반드시 함수 표현식 이후에 참조하고 호출해야 한다.
매개변수와 인수
- 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
- 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관된다.
- 가변인자 함수 구현 시 유용하게 사용 된다.
function hello(name) {
console.log(arguments);
return `${name}님 안녕하세요`;
}
//console.log(name); -> 매개변수는 함수 몸체 외부에서 참조할 수 없다.
var result = hello('홍길동');
console.log(result);
// [Arguments] { '0': '홍길동' }
// 홍길동님 안녕하세요
- 함수는 매개변수의 개수와 인수의 개수가 일치하는지 체크하지 않는다.
- 인수가 부족해서 할당 되지 않은 매개변수의 값은 undefined이다.
result = hello();
console.log(result);
// [Arguments] {}
// undefined님 안녕하세요
- 매개변수보다 인수가 더 많은 경우 초과된 인수는 무시된다.
result = hello('유관순', '신사임당');
console.log(result);
// [Arguments] { '0': '유관순', '1': '신사임당' }
// 유관순님 안녕하세요
function hi(name = '아무개') {
return `${name} 안녕~`;
}
result = hi('홍길동');
console.log(result); //홍길동 안녕~
result = hi();
console.log(result); //아무개 안녕~
반환문
function hello(name) {
// 반환문
return `${name}님 안녕하세요!`;
// 반환문 이후의 문은 실행되지 않고 무시 된다.
console.log(name);
}
console.log(hello('유관순'));
-> 유관순님 안녕하세요!
function func() {
console.log('함수가 호출 되었습니다.');
//return;
// 반환 값이 없을 시 반환문 생략 가능하며 이 때도 암묵적으로 undefined 반환
}
console.log(func());
-> 함수가 호출 되었습니다.
undefined
일급 객체
예시 (뒤에 함수 내용 숙지)
- 무명의 리터럴로 생성할 수 있다.
// 함수명이 없고 변수 hello에 저장됨
var hello = function () {
return '안녕!';
};
- 객체에 저장할 수 있다.
var obj = { hello }; // hello : hello hello라는 함수를 hello라는 속성으로 객체에 저장
function repeat(func, count) { //매개변수
for(var i = 0; i < count; i++) {
console.log(func());
}
return function () { // 반환값
console.log(`${count}번 반복 완료`);
}
}
var returnFunc = repeat(obj.hello, 5);
returnFunc();
실행 시
안녕!
안녕!
안녕!
안녕!
안녕!
5번 반복 완료
출력
'LECTURE > JavaScript' 카테고리의 다른 글
scope - 전역과 지역 스코프, 함수 레벨 스코프, var/let/const (0) | 2023.02.07 |
---|---|
Function - 화살표 함수, 즉시 실행 함수, 재귀 함수, 중첩 함수, 콜백 함수, 순수 함수와 비순수 함수 (0) | 2023.02.07 |
Object literal - ES6 , in 연산자, for in 반복문 (0) | 2023.02.07 |
Object leteral - 객체, 프로퍼티, 메소드 (0) | 2023.02.07 |
ES11 연산자 - 옵셔널 체이닝 연산자, null 병합 연산자 (0) | 2023.02.06 |