// 1. 함수는 무명의 리터럴로 생성 가능
// 2. 함수는 변수에 저장 가능
// 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당
const increase = function (num) {
return ++num;
};
const decrease = function (num) {
return --num;
};
// 2. 함수는 객체에 저장 가능
const auxs = { increase, decrease };
// 3. 함수의 매개변수에 전달 가능
// 4. 함수의 반환 값으로 사용 가능
function makeCounter(aux) {
let num = 0;
return function () {
num = aux(num);
return num;
};
}
// 3. 함수는 매개변수에 함수 전달 가능
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2
arguments 객체는 함수 호출 시 전달된 인수 argument들의 정보를 담고 있는 순회 가능한 iterable 유사 배열 객체이며, 함수 내부에서 지역 변수처럼 사용. 즉, 함수 외부에서는 참조 불가능
유사 배열 객체
length 프로퍼티 가짐
for 문으로 순회 가능
배열은 아니므로 배열 메서드 사용할 경우 에러 발생
Function.prototype.call, Function.prototupe.apply 를 사용해 간접 호출하여 배열 메서드 사용 가능
arguments 객체는 매개 변수를 확정할 수 없는 가변 인자 함수 구현할 때 유용
arguments 객체의 프로퍼티
// 가변 인자 함수 구현
function sum() {
let res = 0;
// arguments 객체는 length 프로퍼티가 있는 유사 배열 객체이므로 for문으로 순회 가능
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
function foo() {}
function bar(x) {}
function baz(x, y) {}
console.log(foo.length); // 0
console.log(bar.length); // 1
console.log(baz.length); // 2
name 프로퍼티
ES6부터 정식 표준 (ES5와 다르게 동작함)
ES6: 함수 객체를 가리키는 식별자를 값
ES5: 빈 문자열
// 기명 함수 표현식
var namedFunc = function foo() {};
console.log(namedFunc.name); // foo
// 익명 함수 표현식
var anonymousFunc = function () {};
console.log(anonymousFunc.name); // anonymousFunc (ES6)
// 함수 선언문
function bar() {}
console.log(bar.name); // bar
__proto__ 접근자 프로퍼티
모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖음
__proto__는 [[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티 ( [[Prototype]] 내부 슬롯에 직접 접근 불가능)
const obj = { a: 1 };
// 객체 리터럴 방식으로 생성한 객체의 프로토타입 객체는 Object.prototype
console.log(obj.__proto__ === Object.prototype); // true
// 객체 리터럴 방식으로 생성된 객체는 프로토타입 객체인 Object.prototype 프로퍼티를 상속 받음
// hasOwnProperty 메서드는 인수로 전달 받은 프로퍼티 키가 객체 고유의 프로퍼티 키인 경우에만 true 반환
console.log(obj.hasOwnProperty("a")); // true
console.log(obj.hasOwnProperty("__proto__")); // false
console.log(Object.prototype.hasOwnProperty("__proto__")); // true
console.log(Object.prototype.hasOwnProperty("hasOwnProperty")); // true
prototype 프로퍼티
prototype 프로퍼티는 생성자 함수로 호출할 수있는 함수 객체, 즉 constructor만이 소유하는 프로퍼티
일반 객체와 생성자 함수로 호출할 수 없는 non-constructor에는 prototype 프로퍼티가 없음