자바스크립트는 함수를 특별한 종류의 값으로 취급한다.
다른 언어에서는 함수를 ‘특별한 동작을 하는 구조'로 취급하는 것과 차이가 있다.
함수 선언 방식이 아닌 함수 표현식으로도 함수를 만들 수 있다.
let sayHi = function() {
alert( "Hello" );
};
함수 생성 방식에 관계 없이 함수는 값이고, 따라서 변수에 할당할 수 있다. 함수는 값이기 때문에 alert() 로 출력하면 함수 코드가 출력된다.
function sayHi() {
alert( "Hello" );
}
alert( sayHi ); // 함수 코드가 보임
sayHi() 처럼 괄호를 붙여주면 함수를 실행할 수 있고, sayHi 처럼 괄호가 없다면 함수 코드가 문자형으로 바뀌어 출력된다. 자바스크립트에서는 괄호가 있어야만 함수가 호출된다!
함수의 본질은 값이기 때문에 변수를 복사해 다른 변수에 복사하는 일도 할 수 있다.
function sayHi() { // (1) 함수 생성
alert( "Hello" );
}
// (1) - 1 함수 표현식으로 함수 생성
let sayHi = function() {
alert( "Hello" );
};
let copiedSayHi = sayHi; // (2) 함수 복사
copiedSayHi(); // Hello // (3) 복사한 함수를 실행
sayHi(); // Hello // 본래 함수도 정상적으로 실행
주의해야 할 점이 있는데, (2) 에서 sayHi() 처럼 괄호를 붙여 변수에 할당했다면 함수가 실행된 후 호출 결과(반환값)이 왼쪽 변수에 할당되어 copiedSayHi 는 undefined 가 되었을 것이다.
괄호를 붙이지 않고 할당했기 때문에 함수를 복사해 줄 수 있다.
💡 함수 표현식 끝의 세미콜론아래 코드에서 ask() 라는 함수의 매개변수로는 question, yes, no 가 있다.
question - 질문
yes - Yes 라고 답한 경우 실행되는 함수
no - No 라고 답한 경우 실행되는 함수
함수는 반드시 question 을 해야 하고, 사용자의 답변에 따라 yes() 나 no() 함수를 호출한다.
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
// confirm 창에서 '확인'을 누르면 yes 함수가 실행된다.
}
function showOk() {
alert( "동의하셨습니다." );
}
function showCancel() {
alert( "취소 버튼을 누르셨습니다." );
}
// 사용법: 함수 showOk와 showCancel가 ask 함수의 인수로 전달됨
ask("동의하십니까?", showOk, showCancel);
위 코드에서 ask 의 인수인 showOk 와 showCancel 은 콜백 함수 또는 콜백 이라고 한다.
콜백 함수란 함수를 함수의 인수로 전달하고, 필요하다면 인수로 전달한 그 함수를 나중에 호출(called back) 하는 것이 콜백 함수의 개념이다.
함수 표현식을 사용하면 같은 코드를 좀 더 짧게 작성할 수 있다.
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
ask(
"동의하십니까?",
function() { alert("동의하셨습니다."); },
function() { alert("취소 버튼을 누르셨습니다."); }
);
ask 함수 안에 이름 없는 함수를 생성해 인자로 넣어주었다. 이렇게 이름 없이 선언한 함수를 익명 함수라고 한다. 익명 함수는 ask 바깥에서는 접근할 수 없다.
💡 자바스크립트에서 함수는 **‘동작'**을 나타내는 **‘값'**이다.함수 표현식과 선언문의 차이를 알아보자!
function sum(a, b) {
return a + b;
}
let sum = function(a, b) {
return a + b;
};
sayHi("John"); // error!
let sayHi = function(name) {
alert( `Hello, ${name}` );
};
sayHi("John"); // Hello, John
function sayHi(name) {
alert( `Hello, ${name}` );
}
let age = prompt("나이를 알려주세요.", 18);
// 조건에 따라 함수를 선언함
if (age < 18) {
welcome();
function welcome() {
alert("안녕!");
}
} else {
welcome();
function welcome() {
alert("안녕하세요!");
}
welcome();
}
// 함수를 나중에 호출합니다.
welcome(); // Error: welcome is not defined
let age = prompt("나이를 알려주세요.", 18);
let welcome;
if (age < 18) {
welcome = function() {
alert("안녕!");
};
} else {
welcome = function() {
alert("안녕하세요!");
};
}
welcome(); // 제대로 동작합니다.
물음표 연산자를 사용해 위 코드를 좀더 단순화할 수 있다. let age = prompt("나이를 알려주세요.", 18);
let welcome = (age < 18) ?
function() { alert("안녕!"); } :
function() { alert("안녕하세요!"); };
welcome(); // 제대로 동작합니다.