holdanddeepdive/javascript-deep-dive

23장 실행 컨텍스트

Opened this issue · 1 comments

image

소스코드 타입

  • 전역 코드 > 전역 실행 컨텍스트
  • 함수 코드 > 함수 실행 컨텍스트
  • eval 코드 > eval 실행 컨텍스트
    • eval : 문자열의 자바스크립트 코드를 실행하는 함수
  • 모듈 코드 > 모듈 실행 컨텍스트 (모듈별 독립적인 모듈 스코프)

실행 컨텍스트 (running execution context)

  • 소스코드를 실행하는 데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
  • 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리, 코드 실행 순서는 실행 컨텍스트 스택으로 관리

소스코드 처리

  1. 소스코드 평가 : 실행 컨텍스트 생성, 선언문을 먼저 실행하여 식별자를 키로 스코프에 등록
  2. 소스코드 실행(런타임) : 소스코드 실행에 필요한 정보는 스코프에서 검색하며 소스코드의 실행 결과는 다시 스코프에 등록

렉시컬 환경

  • 식별자, 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조

When is JavaScript's eval() not evil?

eval()의 큰 리스크 : 성능 코드 주입

  • 성능 : eval()은 인터프리터를 런타임 중간에 호출하므로 오버헤드가 될 수 있음.
  • 코드 주입 : 위험한 코드가 주입될 수 있는데 이는 서버 사이드 자바스크립트에서 문제가 될 수 있음. 브라우저에서도 작은 문제가 될 수도..
  • +) 디버깅 어려움

Code Injection is a very serious issue for javascript if you are at all concerned about your user's data. Injected code will run (in the browser) as if it came from your site, letting it do any sort of shenanigan that the user could do manually. If you allow (third-party) code to enter you page, it can order things on behalf of your customer, or change their gravatar, or whatever they could do through your site. Be very careful. Letting hackers own your customers is just as bad as letting them own your server.