자바스크립트에서는 함수도 하나의 자료형이므로 매개변수로 전달할 수 있습니다. 이렇게 매개변수로 전달하는 함수를 콜백함수라고 합니다.
익명함수를 매개변수로 전달 예
function callFunc(callbackTest) {
for(var i = 0; i < 10; i++) {
callbackTest();
}
}
// 변수는 함수 호출보다 아래에 있으면 안됩니다.
var callbackTest = function() {
alert('콜백함수');
}
callFunc(callbackTest); // 콜백함수 * 10
익명 콜백 함수 예
function callFunc(callback) {
for(var i = 0; i < 10; i++) {
callback();
}
}
callFunc(function() {
alert('함수 호출'); // 함수 호출 * 10
})
콜백 함수는 익명 함수로 사용하는 경우가 많습니다. 매개변수에 익명 함수를 곧바로 입력이 가능하다는 것을 알아둡시다.
function <외부함수>() {
function <내부함수1>() { <코드> }
function <내부함수2>() { <코드> }
<코드>
}
피타고라스의 정리 구현하기
// 제곱을 구하는 함수
function square(x) {
return x * x;
}
// 피타고라스 함수
function pytha(width, height) {
return Math.sqrt(square(width) + square(height));
}
alert(pytha(3, 4)); // 5
밑변과 높이를 매개변수로 받아 빗변의 길이를 리턴합니다.
이름 충돌 예
// 제곱을 구하는 함수
function square(x) {
return x * x;
}
// 피타고라스 함수
function pytha(width, height) {
return Math.sqrt(square(width) + square(height));
}
alert(pytha(3, 4)); // 0
// 삼각형이 직각인지 확인하는 함수
function square(width, height, hypotenuse) {
if(width * width + height + height == hypotenuse * hypotenuse) {
return true;
} else {
return false;
}
}
위에서 만든 square()함수가 아래 square()함수에 덮어씌워지게 되면서 아래 square()를 사용하게 됩니다.
이를 방지하기 위해 다른 이름을 사용할 수도 있지만, 가변 인자 함수로 같은 이름이어도 다른 기능을 수행하게 하여 충돌 예방을 할 수 있습니다.
내부함수 사용 예
// 피타고라스 함수
function pytha(width, height) {
// 제곱을 구하는 함수 (내부함수)
function square(x) {
return x * x;
}
return Math.sqrt(square(width) + square(height));
}
alert(pytha(3, 4)); // 5
// 삼각형이 직각인지 확인하는 함수
function square(width, height, hypotenuse) {
if(width * width + height + height == hypotenuse * hypotenuse) {
return true;
} else {
return false;
}
}
이런식으로 내부함수를 사용하면 함수의 이름충돌을 예방할 수 있습니다. 하지만 반대로 내부함수를 외부에선 사용할 수 없다는 것을 알아두어야 합니다.
:: 내부함수는 내부함수를 포함한 외부함수에서만 사용이 가능합니다. ( 내부함수를 외부에서 개별적으로 사용이 불가능함 )