변수는 데이터에 이름을 짓는 것과 같다고 했다.
함수는 행동이나 절차에 이름을 짓는 것과 같다.
함수는 다음과 같이 선언할 수 있다.
function func1(pram) {
// 해야할 일
}
function
이라는 키워드로 func1
라는 이름의 함수를 선언했다. ()
속에 pram
은 함수를 호출할 때 전달할 값을 넣어준다. 그리고 {}
내부에서 함수가 수행할 일들을 정의한다.
function print(x) {
console.log(x)
}
print('print 함수 사용');
위 print
라는 함수는 호출될 때, 'print 함수 사용'
이라는 문자열을 받았다. 이를 함수가 선언된 절차에 따라 x
라는 변수에 문자열을 전달하고, 내부의 console.log
를 통해 x
에 담긴 문자열이 출력된다.
코드 실행 흐름
1)x
라는 변수에 값을 받아console.log
로 출력
2)'print 함수 사용'
이라는 문자열을 전달, 정의에 따라 문자열 출력
많은 이유들이 있겠지만,
내가 생각한 결정적인 이유는 2가지.
(다른 의견 충분히 수렴합니다.)
만약 특정 숫자를 받아 덧셈과 곱셈을 반복하는 코드를 구현한다고 생각해보자.
console.log(1 + 2);
console.log(1 * 2);
console.log(2 + 3);
console.log(2 * 3);
상상법을 도입해 수억줄이라 생각한다면..?
🧐
함수를 사용해
function addAndMul(a, b) {
console.log(a + b);
console.log(a * b);
}
addAndMul(1, 2);
addAndMul(2, 3);
아마 다음에 더 사용해야할 때도 쉽게 가져다 쓸 수 있을 것이다.
모든 코드들이 함수가 없이 쭉 열거되어 있는 것보다, 기능에 따라 이름을 지어 정의되어 있다면 코드를 관리할 때 더 용이할 것이라고 생각한다.
// ... 수억줄
let a = 1;
let b = 2;
let c = 3;
console.log(a + b - c);
// ... 수억줄
위와 같은 코드가 수억줄 사이에 껴있다.
이 때, a + b + c
로 계산했어야 하지만 a + b - c
와 같이 오타가 생겨버렸다.
저 코드를 찾기 위해 어떻게 해야할까?
🧐
function addThree(a, b, c) {
console.log(a + b - c);
}
addThree(1, 2, 3);
위와 같이 함수로 이름지어져 있었다면 더 쉽게 찾을 수 있다고 생각한다.
함수를 정의할 때, 위와 같은 방식이 아닌 다른 방식으로도 정의할 수 있다. (여기서 다루는 것보다 더 다양)
익명함수의 형태로 표현할 수 있다.
var add = function(a, b) { console.log(a + b) }
add(1, 2) // 3
익명으로 함수를 선언하고, add
라는 변수에 함수를 전달했다. 함수의 기능대로 동작하게 된다.
이는 다른 함수에 인자로 전달하기 편리하다.
function print(f) {
console.log(f());
}
함수는 정의된 곳에서만 사용할 수 있다.
function mul(num) {
return mul * 2;
}
function print(num) {
console.log(num);
mul(num) // num * 2 실행
function add(x) {
return x + 1;
}
add(num); // num + 1 실행
}
print(3);
add(2); // 실행 안됨 Error
add
함수는 print
함수 내부에 정의된 함수로 그 외부인 전역스코프에서는 사용할 수 없다. mul
함수는 전역 스코프에 선언되어 print
내부에서도 사용할 수 있다. 이는 나중에 실행 컨텍스트에 대한 개념을 배우고 스코프 체인에 대해 이해하면 알 수 있다.
함수의 기능을 수행하고, 값을 받아와야 할 때 어떻게 해야 할까?
함수 내부에 return
을 통해 반환값을 지정할 수 있다.
function add(a, b) {
return a + b;
}
let x = add(1, 3); // x = 4
위 함수는 a
와 b
를 받아 a + b
값을 반환한다. 이를 x
라는 변수에 초기화하면 그 값이 전달된다.