
자바스크립트에서는 함수를 "특별한 동작을 하는 구조"가 아닌 "특별한 종류의 값"으로 취급
변수 : 데이터를 나타내는 값
함수 : 동작을 나타내는 값
[ 함수 선언문 ]
function sayHi() {
alert( "Hello" );
}
[ 함수 표현식 ]
let sayHi = function() {
alert( "Hello" );
};
▶ 두 방식 모두 sayHi라는 변수에 저장되는 것.
👉 값이기 때문에 alert를 이용해 함수 코드 출력도 가능
function sayHi() {
alert( "Hello" );
}
alert( sayHi ); // 함수 코드가 보임
❕ alert( sayHi ) 에서 sayHi 옆에 괄호가 없기 때문에 함수 실행은 X
👉 자바스크립트에서는 괄호가 있어야만 함수가 호출된다.
function sayHi() { // (1) 함수 생성
alert( "Hello" );
}
let func = sayHi; // (2) 함수 복사
func(); // Hello // (3) 복사한 함수를 실행(정상적으로 실행됩니다)!
sayHi(); // Hello // 본래 함수도 정상적으로 실행됩니다.
(1) 변수 sayHi에 함수 할당
(2) sayHi를 새로운 변수 func에 복사
❗ 이때 sayHi 다음에 괄호가 있었다면 func = sayHi() 가 되어 sayHi 함수 그 자체가 아니라, 함수 호출 결과(함수의 반환 값) 가 func에 저장되었을 것.
❓ 함수 표현식 끝에는 왜 세미콜론이 있을까?
let sayHi = function() {
alert( "Hello" );
};
function sayHi() {
// ...
}
▶ 중괄호로 만든 코드 블록 끝엔 ;이 없어도 되고, 함수 표현식에서 변수가 할당되는 코드 구문 끝에는 ;이 붙여져야 하기 때문
함수를 함수의 인수로 전달하고, 필요시 전달 받은 함수를 나중에 호출하는 것
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
function showOk() {
alert( "동의하셨습니다." );
}
function showCancel() {
alert( "취소 버튼을 누르셨습니다." );
}
// 사용법: 함수 showOk와 showCancel가 ask 함수의 인수로 전달됨
ask("동의하십니까?", showOk, showCancel);
👉 "yes"라고 대답한 경우 showOk, "no"라고 대답한 경우 showCancel이 콜백
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"); // Hello, John
function sayHi(name) {
alert( `Hello, ${name}` );
}
sayHi("John"); // error!
let sayHi = function(name) {
alert( `Hello, ${name}` );
};
let age = 16; // 16을 저장했다 가정합시다.
if (age < 18) {
welcome(); // (실행)
function welcome() {
alert("안녕!");
}
welcome(); // (실행)
} else {
function welcome() {
alert("안녕하세요!");
}
}
// 중괄호 밖에서 호출 불가
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(); // 동작!
❓ 함수 선언문과 함수 표현식 중 무엇을 선택해야 할까?
▶ 함수 선언문을 먼저 고려하자! 호이스팅에 의해 코드 구성이 좀 더 자유롭고 가독성도 더 좋기 때문
▶ 함수 선언문이 적합하지 않을 때 함수 표현식을 사용하자.
let func = (arg1, arg2, ...argN) => expression
let double = n => n * 2;
let sayHi = () => alert("안녕하세요!");
let age = prompt("나이를 알려주세요.", 18);
let welcome = (age < 18) ?
() => alert('안녕') :
() => alert("안녕하세요!");
welcome();
return으로 반환하기let sum = (a, b) => {
let result = a + b;
return result;
};
alert( sum(1, 2) ); // 3