입력을 받아 출력을 내보내는 일련의 과정을 정의함
함수는 함수 정의(function definition)을 통해 생성
함수를 호출하게 되면 코드 블록에 담긴 문들이 일괄적 실행 -> 반환값을 반환
// 함수의 호출
const result = add(2, 5);
console.log(result); // 7
- 코드의 재사용 : 함수는 몇 번이든 호출 가능
- 유지보수의 편의성 : 코드 중복을 억제하고 재사용성을 높이는 함수 개발
- 코드의 신뢰성 : 실수를 줄임
- 코드의 가독성 : 함수 이름은 자신의 역활을 잘 설명하게 식별자를 붙여 가독성 향상
함수 리터럴은 function 키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성
함수는 객체지만 일반 객체와 다름
일반 객체는 호출할 수 없지만 함수는 호출할 수 있음
함수 이름
매개변수 목록
함수 몸체
function add(x, y) {
return x + y;
}
// 함수 참조
console.log(add); // f add(x, y)
// 함수 호출
console.log(add(2,5)); // 7
// 함수 선언문은 함수 이름을 생략할 수 없음
// 함수 선언문은 표현식이 아님
function (x, y) {
return x + y; // SyntaxError
}
// 기명 함수 표현식
const 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
//함수 참조
console.dir(add); // f add(x, y)
console.dir(sub); // undefined
// 함수호출
console.log(add(2, 5)); // 7
console.log(sub(2, 5)); // TypeError : sub is not a function
// 함수 선언문
function add(x, y) {
return x + y;
}
// 함수 표현식
const sub = function (x, y) {
return x - y;
}
함수 호이스팅(function hoisting) : 함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유의 특징
const add1 = (function () {
var a = 10;
return function (x, y) {
return x + y + a;
};
}());
console.log(add1(1, 2)); // 13
// Function 생성자 함수로 생성한 함수는 클로저를 생성하지 않는 등,
// 함수 선언문이나 함수 표현식으로 생성한 함수와 다르게 동작
const add2 = (function () {
var a = 10;
return new Function('x', 'y', 'return x + y + a;');
}());
console.log(add2(1, 2)); // ReferenceError : a is not defined
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7
function add(x, y) {
return x + y;
}
//매개변수보다 인수가 더 많은 경우 초과된 인수 무시
console.log(add(2, 5, 10)); // 7
// 인수가 전달되지 않는 경우 단축 평가를 사용하여 기본값 할당
function add(a, b, c) {
a = a || 0;
b = b || 0;
c = c || 0;
return a + b + c;
}
console.log(add(1, 2, 3)); // 6
console.log(add(1, 2)); // 3
console.log(add()); // 0
// ex1)
function multiply(x, y) {
return x * y; // 반환문
// 반환문 이후에 다른 문이 존재하면 그 문은 실행되지 않고 무시
console.log('실행되지 않음');
}
const result = multiply(3, 5);
console.log(result); // 15
// ex2)
function foo () {
return;
}
console.log(foo()); // undefined
// ex3)
function multiply2(x, y) {
// return 키워드와 반환값 사이에 줄바꿈이 있으면
return // 세미콜론 자동 삽입 기능(ASI)에 의해 세미콜론 추가
x * y; // 무시
}
console.log(multiply2(3,5)); // undefined
// 매개변수 primitive는 원시 값을 전달받고, 매개변수 obj는 객체를 전달받음
function changeVal(primitvie, obj) {
primitive += 100;
obj.name = 'Kim';
}
// 외부
var num = 100;
var person = { name: 'Lee' };
console.log(num); // 100
console.log(person); // { name: "Lee" }
// 원시 값은 값 자체가 복사되어 전달, 객체는 참조 값이 복사되어 전달
changeVal(num, person);
// 원시 값은 원본이 훼손되지 않음
console.log(num); // 100
// 객체는 원본이 훼손
console.log(person); // { name: "Kim" }
(function () {
var a = 3;
var b = 5;
return a * b;
}());
// 즉시 실행 함수는 반드시 그룹 연산자(...) 감싸야 함
function foo() {
}(); // SyntaxError
// 함수 코드 블록의 닫는 중괄호 뒤에 ";"이 암묵적으로 추가되어 오류 발생
// => function foo() {};();
// 즉시 실행 함수도 일반 함수처럼 값을 반환 가능
var res = (function () {
var a = 3;
var b = 5;
return a * b;
}());
console.log(res); // 15
// 즉시 실행 함수에도 일반 함수처럼 인수를 전달할 수 있음
res = (function (a, b) {
return a * b;
}(3, 5));
console.log(res); //15
function countdown(n) {
for (var i = n; i >= 0; i--) console.log(i);
}
countdown(10);
// 재귀 함수로 변경
function countdown(n) {
if (n < 0) return;
console.log(n);
countdown(n - 1); // 재귀 호출
}
countdown(10);
function outer() {
var x = 1;
// 중첩함수
function inner() {
var y = 2;
// 외부 함수의 변수 참조 가능
console.log(x + y); // 3
}
inner();
}
outer();
// ex1)
// 익명 함수 리터럴을 콜백 함수로 고차 함수에 전달
// 익명 함수 리터럴은 repeat 함수를 호출할 때마다 평가되어 함수 객체를 생성
repeat(5 , function (i) {
if (i % 2) console.log(i);
}); // 1 3
// ex2)
const logOdds = function (i) {
if (i % 2) console.log(i);
};
// 고차 함수에 함수 참조를 전달
repeat(5, logOdds); // 1 3
// 콜백 함수를 사용하는 고차 함수 map
var res = [1,2,3].map(item => item * 2);
console.log(res); // [2, 4, 6]
// 콜백 함수를 사용하는 고차 함수 filter
res = [1,2,3].filter(item => item % 2);
console.log(res); // [1, 3]
// 콜백 함수를 사용하는 고차 함수 reduce
res = [1, 2, 3].reduce((acc, cur) => acc + cur),0);
console.log(res); // 6
순수 함수(prue function) : 부수 효과가 없는 함수
var count = 0; // 순수 함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환 function increase(n) { return ++n; } count = increase(count); console.log(count); // 1; count = increase(count); console.log(count); // 2;
비순수 함수(impure function) : 부수 효과가 있는 함수
var count = 0; function increase() { return ++count; // 외부 상태에 의존하여 외부 상태를 변경 } increase(); console.log(count); // 1; increase(); console.log(count); // 2;
📖 참고도서 : 모던 자바스크립트 Deep Dive 자바스크립트의 기본 개념과 동작 원리 / 이웅모 저 | 위키북스