본문 바로가기
Archive

잘안알려진 함수특성

by livemehere 2022. 8. 31.

객체로서의 함수

자바스크립트에서 함수는 값으로 취급된다.

자료형은 객체이다.

근데 호출을 할 수있는 특별한 형태일뿐, 객체의 속성을 그대로가지고있어서, 프로퍼티를 추가하거나 제거할 수 있다.

 

함수객체에는 기본적으로

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