JavaScript는 웹 페이지에서 복잡한 기능을 구현할 수 있는 스크립트 또는 프로그래밍 언어입니다. HTML로는 웹의 내용을 작성하고, CSS로는 웹을 디자인하며. JavaScript로는 동적으로 변경되는 콘텐츠를 만들고, 멀티미디어를 제어하고, 이미지에 애니메이션을 적용하는 등 거의 모든 작업을 수행할 수 있다.
-
JavaScript는 브라우저에서만 쓸 목적으로 고안된 언어이지만, 지금은 다양한 환경에서 쓰이고 있다. 브라우저뿐만 아니라 서버에서도 실행할 수 있고, JavaScript 엔진이 있는 모든 디바이스에서 동작한다.
-
JavaScript 엔진은 JavaScript 코드를 실행하는 프로그램 / 인터프리터를 말한다
-
엔진의 종류는 다양하며, 엔진마다 특유의 코드네임이 있습니다.
| 브라우저 | 자바스크립트 가상 머신 |
|---|---|
| Chrome, Opera | V8 |
| Firefox | SpiderMonkey |
| IE | Trident, chakra |
| Microsoft Edge | ChakraCore |
| SquirrelFish | Safari |
- 엔진(브라우저는 내장 엔진)이 스크립트를 읽습니다.(피싱)
- 읽어들일 스크립트를 기계어로 전환한다.(컴파일)
- 기계어로 전환된 코드가 실행됩니다. 기계어로 전환되었기 때문에 실행 속도가 빠릅니다.
엔진은 프로세스 각 단계마다 최적화를 진행합니다. 컴파일이 끝나고 실행 중인 코드를 감시하면서, 코드로 흘러가는 데이터를 분석하고, 분석 결과를 토대로 기계어로 전환된 코드를 다시 최적화하기도 합니다.
JavaScript의 능력은 실행 환경에 상당한 영향을 받습니다. 브라우저 환경에선 웹페이지 조작, 클라이언트와 서버의 상호작용에 관한 모든 일을 할 수 있습니다.
브라우저에서 JavaScript로 할 수 있는 일은 다음과 같다.
- 페이지에 새로운 HTML을 추가하거나 기존 HTML, 혹은 스타일 수정하기
- 마우스 클릭이나 포인터의 움직임, 키보드 키 눌림 등과 같은 사용자 행동에 반응하기
- 네트워크를 통해 원격 서버에 요청을 보내거나, 파일 다운로드, 업로드하기
- 쿠키를 가져오거나 설정하기, 사용자에게 질문을 건네거나 메시지 보여주기
- 클라이언트 측에 데이터 저장하기(로컬 스토리지)
웹 브라우저는 보안을 위해 JavaScript의 기능에 제약을 걸어놓았습니다. 이런 제약은 악성 웹페이지가 개인 정보에 접근하거나 사용자의 데이터를 손상하는 것을 막기 위해 만들어졌습니다.
몇 가지 제약사항이 있습니다.
-
웹페이지 내 스크립트는 디스크에 저장된 임의 파일을 읽거나 쓰고, 복사하고 실행할 때 제약을 받을 수 있다. 운영체제가 지원하는 기능을 브라우저에서 쓰지 못하게 막았기 때문에 카메라나 마이크 같은 디바이스와 상호작용 하려면 사용자의 명시적인 허가가 있어야한다.
-
브라우저 내 탭과 창은 대개 서로의 정보를 알 수 없다. 그런데 JavaScript를 사용해 한 창에서 다른 창을 열 때는 예외가 적용되지만 도메인이나 프로토콜, 포트가 다르면 페이지 접근이 어렵다. 이런 제약 사항을 동일 출처 정책 (Same Origin Policy)이라고 부른다. 이 정책을 피하려면 두 페이지는 데이터 교환에 동의 해야하고, 동의와 관련된 특수한 JavaScript 코드를 포함하고 있어야 한다.
-
자바스크립트를 이용하면 페이지를 생성한 서버와 쉽게 정보를 주고 받을 수 있다. 하지만 타 사이트나 도메인에서 데이터를 받아오는 건 불가능하다. 가능하더라도 원격 서버의 명확한 승인이 필요하다.(HTTP 헤더등을 이용) 이 역시 보안을 위한 제약 사항이다.
- HTML/CSS와 완전히 통합할 수 있다.
- 간단한 일은 간단하게 처리할 수 있게 해준다.
- 모든 주요 브라우저에서 지원하고 기본 언어로 사용된다.
- 서버나 모바일 앱 등도 제작 가능하다.
브라우저에서 실행 되기 전에 자바스크립트로 트랜스파일(transpile, 변환) 할 수 있는 새로운 언어들이 등장했다.
- CoffeeScript: 짧은 문법을 도입하여 명료하고 이해하기 쉬운 코드를 작성할 수 있다.
- TypeScript: 개발을 단순화 하고 복잡한 시스템을 지원하려는 목적으로 '자료형의 명시화(strict data typing)'에 집중해 Microsoft가 개발한 언어이다.
- Flow: TypeScript처럼 자료형을 강제하는데, 다른 방식을 사용한다. Facebook이 개발했다.
- Dart: 모바일 앱과 같이 브라우저가 아닌 환경에서 동작하는 고유의 엔진을 가진 독자적 언어이다. Google이 개발하였다.