- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다
- 함수의 매개변수에 전달할 수 있다
- 함수의 반환값으로 사용할 수 있다
함수의 일급 객체로서 가지는 가장 큰 특징
함수의 일반 객체와의 차이
ex. 자바스크립트의 함수
const increase = function (num){
return ++num;
}
const decrease = function (num){
return --num;
}
const auxs = {increase, decrease}
function makeCounter(aux){
let num =0;
return function (){
num = aux(num);
return num;
};
}
const increaser = makeCounter(auxs.increase);
console.log(increaser());
console.log(increaser());
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser());
함수는 객체
즉 프로퍼티를 가질 수 있다
function square(number){
return number * number
}
console.dir(square)
square함수의 모든 프로퍼티의 프로퍼티 어트리뷰트를 확인해보면
: arguments, caller, length, name, prototype 프로퍼티
함수 객체의 프로퍼티들
arguments 객체는 인수를 프로퍼티 값으로 소유, 프로퍼티 키는 인수의 순서를 나타낸다
arguments 객체의 callee 프로퍼티
: 호출되어 arguments 객체를 생성한 함수 즉 함수 자신을 가리킨다
: arguments 객체의 length는 인수의 개수를 가리킨다
cf. arguments 객체의 Symbol.iterator 프로퍼티
arguments 객체의 Symbol 프로퍼티
: arguments 객체를 순회 가능한 자료구조인 이터러블로 만들기 위한 프로퍼티
function muliply(x,y){
const iterator = arguments[Symbol.iterator]();
//next 메서드를 호출하여 이터러블 객체 arguments를 순회
console.log(interator.next()) //{value: 1, done: false}
console.log(interator.next()) //{value: 2, done: false
console.log(interator.next()) //{value: 3, done: false
return x * y
}
multiply(1,2,3) //1,2,3이라는 인수를 돌면서 value는 1이 나오고 done(순회가 끝난지에 대한 의미)
가변 인자 함수
자바스크립트는 매개변수의 개수, 호출 시 전달 인수의 개수를 확인하지 않는다
함수 호출 시 인수 개수 확인하고 이에 따라 함수의 동작을 달리 정의하는 함수
이때 arguments 사용
function sum(){
let res = 0;
for(let i=0; i<arguments.length; i++){
res += arguments[i]
}
return res;
}
console.log(sum()) //0
console.log(sum(1,2));//3
console.log(sum(1,2,3)) //6
arguments 객체
function sum(...args){
return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1,2)); //3
function foo(func){
return func();
}
function bar(){
return 'caller:' + bar.caller;
}
console.log(foo(bar)); //caller : function foo(func){...}
console.log(bar()); //caller: null
Node.js환경에서 실행하면 다른 결과가 나온다. 모듈이기 때문에!
함수 객체의 length 프로퍼티는 함수 정의 시 선언한 매개변수의 개수
arguments 객체의 length 프로퍼티와 함수 객체의 length 프로퍼티 값은 다를 수 있다
function bar(x){
return x;
}
console.log(bar.length); //1
function baz(x,y){
return x*y
}
console.log(baz.length); //2
함수 이름을 나타낸다
//기명 함수 표현식
var namedFunc = function foo(){};
console.log(namedFunc.name); //foo
//익명 함수 표현식
var anonFunc = function(){ };
console.log(anonFunc.name)//ES6:anonFunc(변수 이름), ES5:빈 문자열
//함수 선언문
fuction bar(){}
console.log(bar.name); //bar
함수 이름과 함수 객체를 가리키는 식별자는 의미가 다르다
함수를 호출할 때는 함수 이름이 아닌 함수 객체를 가리키는 식별자로 호출 ?
[[Prototype]]
//함수 객체는 prototype 프로퍼티를 소유한다
(function(){}).hasOwnProperty('prototype'); //true
//일반 객체는 prototype 프로퍼티를 소유하지 않는다
({}).hasOwnProperty('prototype');//false
함수
선언문 : 런타임 이전에 함수 객체가 생성(함수 객체로 초기화 / 함수 호이스팅)
표현식 : var add가 먼저 선언이 되고, undefined로 저장이 된다(undefined로 초기화가 된다/ 변수 호이스팅 : undefined)