TIL-8 자바스크립트 완벽 가이드, eval() 사용하면 안됨

khundi·2022년 6월 4일
0
post-custom-banner

- 셸(shell, 쉘)

운영체제 상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램.

명령 프롬프트는 윈도우의 CLI 셸이다. (출처 - 위키백과 https://ko.wikipedia.org/wiki/%EC%85%B8)

이름이 셸(shell)인 이유는 사용자와 운영체제의 내부(커널) 사이의 인터페이스를 감싸는 층이기 때문이다.

셸은 일반적으로 명령 줄과 그래픽 형 두 종류로 분류된다.
명령 줄 셸은 CLI(command-line interface, 명령 줄 인터페이스)를 제공하는 반면,
그래픽 셸은 GUI(graphical user interface, 그래픽 사용자 인터페이스)를 제공한다.

- 옵셔널 체이닝(optional chaining)

옵셔널 체이닝이 있기 전에 한 사례를 보면 없는 정보를 변수에 할당하려할 때

let user = {};
alert(user.address.street); // TypeError: Cannot read property 'street' of undefined

TypeError가 발생하여 코드가 동작하지 않는다.
과거엔 AND연산자를 사용해서 에러를 피했다.

let user = {};
alert(user && user.address && user.address.street) // undefined

undefined 을 반환하더라도 코드가 작동되는 모습이다.
하지만 코드가 너무 길다는 단점이 있다.

옵셔널 체이닝의 등장으로 이를 해결했다.
?.?.'앞'의 평가 대상이 'undefined'나 'null'이면 평가를 멈추고 undefined를 반환한다. (단락 평가)

그리하여 옵셔널 체이닝을 이용해보면

let user = {};
alert(user?.address?.street) // undefined

으로 변경해볼 수 있다.

- eval() 함수를 사용하면 안되는 이유

  • 성능
    eval()에 전달되는 매개변수는 동적이다. 따라서 자바스크립트가 이 매개변수에 대해 알 수 있는 방법은 없다. 그렇기 때문에 자바스크립트가 eval을 실행하려면 런타임에 해당 매개변수를 해석/컴파일 해야한다. 매개변수가 복잡하다면 성능을 많이 잡아먹는다.

  • 보안
    eval()을 사용하면 다른 제3자가 악성 코드를 실행할 수 있는 위험이 생긴다. eval() 함수는 임의의 문자열을 받아 자바스크립트 코드로 실행하기 때문이다. 제3자의 코드가 eval()이 호출된 위치의 스코프를 볼 수 있다.

임의의 문자열을 알 수 있다면 eval()을 쓸 필요가 없다.
그리고 동적으로, 사전에 임의의 문자열을 알 수 없더라도 대개 eval() 없이 목표를 달성할 수 있다.

- 용어 간단 정리

caller: 호출하는 쪽
callee: 호출 당하는 쪽
인터프리트: 코드를 읽어나가며 해석하여 실행하는 것.
컴파일: 어떤 언어로 작성된 코드를 다른 언어로 바꾸는 것.

profile
안녕하세요. 웹 프론트엔드 개발자 전성훈입니다.
post-custom-banner

0개의 댓글