함수란 어떤 작업을 수행하기 위해 필요한 문(statement)들의 집합을 정의한 코드 블록
- 유지보수성, 재사용성, 높은 가독성
- 함수는 데이터가 아닌 하나의 특별한 값이고 그것을 할당할 수 있다.
//함수 선언
funtion 함수명(매개변수=인자, 콤마로, 구분) {
//함수 본문
return 반환 값;
};
//함수 호출
함수명(매개변수);
return
문으로 결과값을 반환 가능 → 반환값(return value)var square = function(number) {
return number * number;
};
// 기명 함수 표현식(named function expression)
var foo = function multiply(a, b) {
return a * b;
};
// 익명 함수 표현식(anonymous function expression)
var bar = function(a, b) {
return a * b;
};
console.log(foo(10, 5)); // 50
//기명함수의 함수명으로 호출 시 에러뜸
console.log(multiply(10, 5)); // Uncaught ReferenceError: multiply is not defined
⚠️ 주의할점 ⚠️
- 할당된 변수는 함수명이 아니라 할당된 함수를 가르키는 참조값을 저장한다.
- 함수가 할당된 변수를 사용해 함수를 호출하지 않고 기명 함수의 함수명을 사용해 호출하게 되면 에러가 발생!
→ 함수 표현식에서 사용한 함수명은 외부 코드에서 접근 불가능하기 때문
- 그렇다면 함수 선언문에서는??
→ 자바스크립트 엔진에 의해 함수표현식으로 형태가 변경되었기 때문!
- 결국 함수 선언문도 함수 표현식과 동일하게 함수 리터럴 방식으로 정의되는 것이다.
Function.prototype.constructor 프로퍼티로 접근
new Function(arg1, arg2, ... argN, functionBody)
함수 선언문과 함수 표현식의 함수 리터럴 방식
→ 이는 결국 내장 함수 Function 생성자 함수로 함수를 생성하는 것을 단순화시킨 short-hand(축약법)
Function 생성자 함수로 함수를 생성하는 방식은 일반적으로 사용하지 않는다.
function add(a, b) {
return a + b;
}
const sum = add;
console.log(add(1,1)) //2
console.log(add(1,1)) //2
일급 객체 조건
1. 무명의 리터럴로 표현이 가능하다.
2. 변수나 자료 구조(객체, 배열 등)에 저장할 수 있다.
3. 함수의 매개변수에 전달할 수 있다.
4. 반환값으로 사용할 수 있다.
function add(a,b) {
return a + b;
}
// 매개변수 a, b
add(1,2);
// 전달인자=인수 1, 2
undefined
// 매개변수의 기본값은 무조건 undefined
// 매개변수의 정보는 함수 내부에서 접근이 가능한 arguments 객체에 저장됨
// 매개변수 기본값 Default Parameters a = 1, b = 1
function add(a = 1, b = 1) {
console.log(a);
console.log(b);
console.log(arguments);
console.log(arguments[1]);
return a + b;
}
add();
/* 출력
1
1
[Arguments] {}
undefined
*/
// 콜백함수
const boy = name => console.log(`🙇♂️ Hi ${name}!`);
const girl = name => console.log(`🙇♀️ Hi ${name}!`);
// 전달된 action -> 콜백함수
// 전달될 당시에 함수를 바로 호출해서 반환된 값을 전달하는 것이 아니라
// 함수를 가리키고 있는 함수의 레퍼런스(참조값) 전달!
// 따라서 함수는 고차함수안에서 **필요한 순간에 호출**이 나중에 된다.
function welcome(name, action) {
if (typeof name !== 'string') {
console.log('wrong name type!');
return;
}
let result = action(name);
return result;
}
welcome('John', boy); //🙇♂️ Hi John!
welcome('Reira', girl); //🙇♀️ Hi Reira!
boy()
do boy
) 함수가 가리키는 주소를 전달return
생략 시 undefined
반환return
만 있을 경우, 함수가 즉시 종료return
이후에 다른 구문이 존재할 경우, 그 구문은 실행되지 않는다.=>
를 사용하여 함수를 선언var x = function(x, y) {
return x * y;
}
const x = (x, y) => x * y;
//간결화
const arrow = p1 => p1 + p2;
//즉시 실행 함수는 소괄호로 감싸준다.
(function () {
// ...
}());
function parent(param) {
let parentVar = param;
function child() {
let childVar = 'lee';
console.log(parentVar + ' ' + childVar); // Hello lee
}
child();
console.log(parentVar + ' ' + childVar);
// Uncaught ReferenceError: childVar is not defined
}
parent('Hello');
참고자료
poiemaweb
ko.javascript.info
velog
그 외 도서 참고