함수도 객체다. *
일급객체
함수는 Function 타입의 인스턴스이며, 다른 객체(참조타입)와 같이 속성과 메서드를 가진다.
함수명은 함수 객체를 가리키는 포인터일 뿐이다.
🧐 why function is first-class-citizen ???
: function 키워드를 통해 함수를 생성한다.
function exam (x , y) {
return x + y;
}
: 정의된 함수는 반드시 ‘함수명’이 정의 되어야 한다. (선언은 위 리터럴 방식과 같다.)
function exFunc() {
return true;
}
```javascript
//자바스크립트 엔진에서는 아래와 같이 변경되어 실행
var exFunc = function exFunc(){
return true;
}
: 자바스크립트에서는 함수도 하나의 값처럼 취급된다. 생성된 함수를 변수에 저장하는 방식이다.
// 가명함수 표현식
var funcVar = function sum ( x , y ) {
if( x < 0 || y < 0)
return sum( x + 1 , y + 1); //재귀호출 용도
else
return x + y;
};
let hey = funcVar; //함수의 참조값 가지므로 그대로 값 할당 가능
hey(1,2); //3
funcVar(3,4); //7
sum(1,2); //Error! Sum is not defined!!! (호출❌)
익명함수
: 함수이름은 선택 사항으로, 이름이 없을 경우 ‘익명 함수 표현식’이라고 한다.
가명함수
: 이름이 포함된 함수 표현식
함수 표현식에서 사용된 함수는 외부 코드에서 접근 불가능하다.
해당 함수를 재귀적으로 호출할 때 사용한다.
arguments, 함수 내 소스 정의하여 생성합니다.
new Function (arg1, arg2, ..., argN, functionBody);
let examFunc = new Function('x','y', 'return x * y');
examFunc(3,5); //15
비교 <> | 일반함수 | 생성자함수 |
---|---|---|
프로토타입 | Function .prototype | 생성자함수 .prototype |
리턴 값 X | return undefined | return this |
자바스크립트에서는 원시타입을 제외한 모든 것을 '객체'로 정의한다.
함수도 예외는 아니다. 더구나 함수는 일급객체 이다...!
*일급객체 : 함수를 객체로 취급할 수 있다. [ 함수형 프로그래밍 가능 ]
let item = function (pName) { return `Hello, ${pName}`; };
let arrItem = [item];
let objItem = {
me: 'who am i',
meFunc: function() {
return 'I am jaen';
}
};
arrItem[0]('jaen'); //"Hello, jaen"
objItem.meFunc(); //"I am jaen"
let wow = function(pFunc){
if(typeOf(pFunc) === "function")
pFunc();
}
wow(function(){return true;}); //함수 인자 전달~
let yeah = function(){
return function () { return 'happy js';}; //함수 리턴~
}
let really = yeah(); //함수 자체가 값으로 취급
really(); //'happy js'
function exFunc1(){ //함수 선언문
return "gogo 2020";
}
exFunc1.isOk = true; //객체 프로퍼티 추가
let exFunc2 = function exFunc2 (){ //함수 표현식
return true;
}
exFunc2.isOk2 = false; //객체 프로퍼티 추가
console.log(exFunc1,exFunc1(),exFunc1.isOK);
//ƒ exF(a,b){return a+b;} "gogo 2020" true
console.log(exFunc2,exFunc2(),exFunc2.isOK);
//ƒ exF(){return true;} true false
함수 역시 객체이므로 객체 기능 호출 가능 + 함수 객체만의 표준 프로퍼티
[공통점]
프로토타입 객체를 가리킴
[차이점]
property : 함수 객체(Function.property))에서만 가지는 속성값
proto : 모든 객체에서 가지는 자신의 부모역활을 하는 프로토타입을 가리킴 - “모든 갹채의 부모, 내부 프로퍼티"
함수 생성 시 arguments
, this
정보들을 함께 전달하여 생성한다.