Miscellaneous

김상연·2022년 12월 18일

JavaScript

목록 보기
18/19

1. Proxy

new Proxy(any-element, {...traps...})의 형태다. 첫번째 인자인 any-element를 wrapping 해 주는데, 뒤에 오는 traps에서는 해당 객체의 내장(built-in) 기능들을 재 정의 할 수 있다.(정확히는 intercept하는 것)

여기서 말하는 내장 기능들은 예를 들면 배열의 어떤 인덱스에 해당하는 값을 읽는다던가, 덮어 쓴다던가, 혹은 삭제한다던가.. 정말 이런 기본적인 것들이다. 예를들어 array에서 그 길이보다 더 큰 index를 참조하면 undefined를 뱉는데, 바로 이런 것들을 수정 할 수 있다.

너무나 특수한 경우에나 쓰일 것 같아서 지금은 '아~ 이런것도 있구나~' 하고 간단히 읽고 넘어간다.

2. eval

내장 함수다. 인자로 들어오는 string-of-code를 '실행'한다. use-strict 모드에서는 자기만의 lexical environment를 가지며, outer vairable을 읽고 쓸 수 있다.

예시)

let x = 5;
eval("x = 10");
console.log(x); // 10, value modified

딱 봐도 에러 나기 좋게 생겼다. 사실 이것은 과거 JS가 매우 빈약할 때나 쓰던 것이라고 한다. 그땐 대부분의 실행을 eval로 해야 했다고.

한편, new Function이 기억 날 것이다.

let f = new Function('a', 'console.log(a)');

f(5); // 5

이놈도 문자열로 된 코드를 실행한다고 했다. eval과 다른 점이라면,

  • global scope에서 함수를 생성한다.
  • 따라서 지역 변수에 접근 할 수 없다.

지역 변수에 접근 할 수 없지만 대신 파라미터에 담아서 함수 안으로 넘겨 줄 수 있다. 혼란을 막아주고, 기능은 기능대로 충분하고 훨씬 좋다. 꼭 필요하다면 이것을 사용해라. eval은 evil이다.

3. Currying

함수를 쪼개준다. 쪼개서 부분적으로 실행 할 수도 있고, 일부 매개변수에 기본값인 인자를 넣고 실행 할 수도 있다.

그러나 나는 이게 딱히 왜 필요한지 모르겠다. 그냥 애초에 함수를 잘 쪼개서 만들면 될 일 아닌가? '하나의 함수, 하나의 기능' 원칙만 잘 지키면 될 일 같다.

profile
리눅스와 컴퓨터 프로그래밍

0개의 댓글