JS에서는 함수도 객체이며 값이다.
다른 언어와 다르게 js에서는 함수가 값이 될 수 있다는 점이다.
정규 표현식이 이것을 쉽게 표현 해준다.
let a = "value" // 값이 있기에 a에 할당가능하다.
function a(){}
let a = function(){} //아래 위가 똑같음, function a(){}이 값이기 때문에 a에 저장한다.
위의 식을보고 이해했다면
a = {
b:function(){
}
}; // key = b, value = function(){}
즉, 키는 변수와 같은 역할을 한다.
객체에서 변수의 역할을 하는 것을 속성(Property)라고 부른다.
그리고 이렇게 객체의 속성 값으로 담겨진 함수를 메소드(method)라고 부른다.
함수는 함수의 리턴 값으로도 사용할 수 있다.
function cal(mode){
var funcs = {
'plus' : function(left, right){return left + right},
'minus' : function(left, right){return left - right}
}//메서드가 'plus','minus'가있다.
return funcs[mode]; //funcs['plus'
}
alert(cal('plus')(2,1));
//
alert(cal('minus')(2,1));
cal('plus')가 return문에 의해서 funcs의 메서드 'plus'가 mode로 들어가면서 'plus'함수 function(left, right){return left + right}를 실행하게 된다.
이어서 나오는 ()의 의미는 함수를 호출하는 것이기때문에 이어서
함수의 인자 값으로 (2,1)을 넣기 때문에 최종적으로는
3이라는 값을 출력하게 된다.
var process = [
function(input){ return input + 10;},//input =1
function(input){ return input * input;}, // input = 11*11
function(input){ return input / 2;} //input = 121 / 2
];
var input = 1;
for(var i = 0; i < process.length; i++){
input = process[i](input);
}
alert(input);
배열도 같은 방식으로 실행된다.
first-class citizen(Object, value, entity)
함수는 변수, 매개변수, 리턴 값으로 사용할 수 있기 때문에 fcc라고 볼 수 있다.
= 어떠한 함수가 수신하는 인자가 함수인 경우를 callback라고 부른다.
function sortNumber(a,b){
return b-a; //콜백 함수
}
var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
alert(numbers.sort(sortNumber)); // array, [20,10,9,8,7,6,5,4,3,2,1]
값으로 사용될 수 있는 특성을 이용하면 함수의 인자로 함수로 전달할 수 있다. 값으로 전달된 함수는 호출될 수 있기 때문에 이를 이용하면 함수의 동작을 완전히 바꿀 수 있다. 인자로 전달된 함수 sortNumber의 구현에 따라서 sort의 동작방법이 완전히 바뀌게 된다.
Reference