- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달 할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
함수는 객체이다.
함수 고유 프로퍼티 :
arguments, caller, length, name, prototype
__proto__
: 접근자 프로퍼티(Object.prototype
)객체의 프로퍼티를 상속받은 것
argument 프로퍼티 값
은argument 객체
다.
argument 객체
는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한유사배열 객체
이며, 함수 내부에서 지역 변수처럼 사용된다.
1. 선언된 매개변수 > 인수
: 인수가 전달되지 않아 전달 되지 않은 매개변수의 값은undefined
로 초기화 상태로 유지
2. 선언되 매개변수 < 인수
: 초과된 인수는 무시되며, 모든 인수는 암묵적으로 argument 객체의 프로퍼티로 보관된다.
인수의 개수를 가리킨다.
- 매개변수 개수를 확정할 수 없는
가변 인자 함수
를 구현할때 유용하다.배열 객체
로 length프로퍼티를 가진 객체로 for문으로 순회할 수 있는 객체를 말한다.
인수의 개수를 확인하지 않은 자바스크립트 특성상 개수를 확인하고 이에 따른 함수의 동작을 정의 할 필요가 있다.
function sum(){
let res = 0;
for(let i = 0; i<argument.length; i++){
res += argument[i];
}
return res;
}
console.log(sum()); //0
console.log(sum(1,2)); //3
console.log(sum(1,2,3)); //6
Function.prototype.call
Function.prototype.apply
를 사용해 간접적 호출 할 수 있으나, 번거롭다.ES6이후 배열메서드를 사용하기 위한 불편함을 해소하기 위해 생겨났다.
//ES6 Rest Parameter
function sum(...args){
return args.reducd((pre,cur)=> pre + cur, 0);
}
console.log(sum(1,2)); //3
console.log(sum*1,2,3,4,5)); //15
console.dir
메서드를 이용해 함수 객체 내부를 볼 수 있다.Object.getOwnPropertyDescriptors
메서드로 모든 프로퍼티 어트리뷰트를 확인 가능하다.ECMASCript 사양에 포함되지 않은 비표준 프로퍼티임
함수를 정의할때 선언한 매개변수의 개수를 가르킨다.
- argument.length프로퍼티(인자의 개수)와 다르다.
function foo(){};
console.log(foo.length); //0
function bar(x,y){
return x *y;
}
console.log(bar.length); //2
함수 이름을 나타낸다.
함수 객체를 가리키는식별자
를 값으로 갖는다.
//기명 함수 표현식
var namedFunc = function foo(){};
console.log(namedFunc.name); //foo
//익명 함수 표현식
var anonymousFunc = function(){};
//ES5 : name 프로퍼티는 빈문자열을 값을 갖는다.
//ES6 : name 프로퍼티는 함수 객체를 가리키는 변수 이름을 값으로 갖는다.
console.log(anonymousFunc.name); //anonymousFunc
//함수 선언문
function bar(){};
console.log(bar.name); //bar
__ porto__
접근자 프로퍼티모든 객체는 [[prototype]]의 내부 슬롯을 갖는다.
이 내부 슬롯에 직접 접근할 수 없는데 간접적으로 접근하기 위해 사용하는 접근자 프로퍼티이다.
생성자 함수로 호출할 수 있는 함수 객체
constructor만이 소유하는 프로퍼티이다.
- 함수가 객체를 생성하는 생성자 함수로 호출될 때 생성자 함수가 생성할 인스턴스의 프로토타입 객체가 된다.
자바스크립트의 함수는 일급객체이지만 일급객체의 조건은 무명함수일때 인데 함수 선언문으로 정의한 함수는 일급객체인것인지 아닌지건지....기명함수로 된 함수가 변수의 값으로 들어가 있는 경우가 있는데 이럴때에는 선언문으로 정의된 함수는 일급객체인 것인가???? 표현식인 건가???
그러면 선언문으로 정의된 함수는 뭐지????
이해가 되지 않은 부분이 있는데 해결하기에는 내 배움이 짧은 것 같다. 일단은 큰 그림을 잡고 공부하는 방향으로 개념을 알고 다시 볼때 알아보는 것으로 해야할 것 같다.