function add(num1, num2) {
return num1 + num2;
}
// function surprise(operator:number){
// }
// 타입스크립트의 경우, surprise 함수는 operator라는 숫자를 가져온다고 이해할 수 있다.
// function surprise(operator:()=>{}){
// }
// surprise는 oprator라는 콜백함수를 받아온다는 것을 이해할 수 있다.
function divide(num1, num2) {
return num1 / num2;
}
function surprise(operator) {
const result = operator(2, 3);
console.log(result);
}
// surprise();
// Uncaught TypeError: operator is not a function
// at surprise (function.js:15)
// at function.js:18
// operator는 아무런 값을 전달하지 않아 undefined 상태이다.
// surprise(add);
// add함수를 전달하면, add가 가리키는 함수의 주소값,
// add는 add자체에 변수 공간이 할당되어서, add가 가리키는 레퍼런스가 들어있다.
// surprise의 operator에는 add의 레퍼런스가 전달된다.
// 따라서 add를 수행하는 것과 동일하다.
// NaN
// num1과 num2에 아무런 데이터도 전달하지 않았기 때문에, not a number가 뜬다.
// operator(5,3)으로 인자를 전달하면 5가 출력된다. 이는 add(5,3)을 호출한 것과 같다.
// operator인자의 이름은 surprise라는 함수를 호출하는 사람이 담고 있는 데이터를 전달하는데,
// add의 레퍼런스를 이용해 함수를 호출한다. 그리고 호출한 add의 인자는 두개의 숫자이기 때문에, 이를 넣어주면 결과가 출력된다.
// surprise(divide);
// 이렇게 여러 함수를 바꿔가면서 레퍼런스를 호출할 수 있다./
// 함수의 인자의 이름은 임의로 정할 수 있다,/