객체로서의 함수
자바스크립트에서 함수는 값으로 취급된다.
자료형은 객체이다.
근데 호출을 할 수있는 특별한 형태일뿐, 객체의 속성을 그대로가지고있어서, 프로퍼티를 추가하거나 제거할 수 있다.
함수객체에는 기본적으로
name, length 프로퍼티가 있다.
자바스크립트 명세서에는 contextual name 이라고한다.
function sayHi() {
alert("Hi");
}
alert(sayHi.name); // sayHi
객체의 메서드이름도 가져올 수 있다.
let user = {
sayHi() {
// ...
},
sayBye: function() {
// ...
}
}
alert(user.sayHi.name); // sayHi
alert(user.sayBye.name); // sayBye
length는 매개변수의 개수를 반환한다.
function f1(a) {}
function f2(a, b) {}
function many(a, b, ...more) {}
alert(f1.length); // 1
alert(f2.length); // 2
alert(many.length); // 2
커스텀 프로퍼티
함수외부에서 프로퍼티를 추가해줄 수 있고, 내부에서는 참조하여 값을 수정할 수 있다.
function sayHi() {
alert("Hi");
// 함수를 몇 번 호출했는지 세봅시다.
sayHi.counter++;
}
sayHi.counter = 0; // 초깃값
sayHi(); // Hi
sayHi(); // Hi
alert( `호출 횟수: ${sayHi.counter}회` ); // 호출 횟수: 2회
그러면 클로저를 대체할 수 있는것아닌가?
라는 생각이드는데, 조금 차이점이있다면, 커스텀 프로퍼티는 외부에서 접근할 수 있고, 클로저는 렉시컬 스코프에 따라서 외부에서 접근할 수 없는 변수를 만든다는 점이 있다.
new Function 문법
문자열을 그대로 함수로 동적으로 생성하는 문법이다.
런타임에 문자열을 함수로 생성할 수 있다.
let func = new Function ([arg1, arg2, ...argN], functionBody);
let f = new Function('console.log(1)');
let a = new Function ('a','b', 'console.log(a+b); return a+b');
console.log(a(1,2))
이문법도 마찬가지로 New 연산자를 사용해서 생성했기 때문에 렉시컬 환경이 생기지않고, 전역 렉시컬 환경을 참조하게 된다.
반응형
'Archive' 카테고리의 다른 글
함수 바인딩 (0) | 2022.09.01 |
---|---|
call/apply 와 데코레이터, 포워딩 (0) | 2022.09.01 |
전역 객체 (0) | 2022.08.31 |
렉시컬 환경과 클로저 (0) | 2022.08.31 |
재귀와 실행컨텍스트 (0) | 2022.08.31 |