JavaScript(자바스크립트)는 객체 기반의 스크립트 프로그래밍 언어이다. 이 언어는 웹 브라우저 내에서 주로 사용되며, 다른 응용 프로그램의 내장 객체에도 접근할 수 있는 기능을 가지고 있다. 또한 Node.js와 같은 런타임 환경과 같이 서버 프로그래밍에도 사용되고 있다. [출처: 위키백과]
일급함수(first-class function)
일반 객체처럼 모든 연산이 가능한 함수로 함수의 매개변수로 전달이 가능하고, 함수의 반환값이 될 수 있고, 변수에 할당할 수 있으며 동일 비교가 가능하다.
자바스크립트의 객체 지향 구현
자바스크립트는 프로토타입 체인, 클로저 등으로 객체지향의 상속, 캡슐화(정보 은닉) 등의 개념을 구현한다. 정보 은닉(information hiding)이란 어떤 모듈 내 로직에 대해 외부로의 노출을 최소하하여, 모듈 간의 결합도를 낮추고 유연성을 높이고자 하는 것이다.
폴리필(polyfill), 트랜스파일(transpile)
폴리필은 브라우저가 지원하지 않는 코드를 브라우저에서 사용할 수 있도록 변환한 코드 조각이나 플러그인이다. 트랜스파일은 최신 버전의 코드를 예전 버전의 코드로 변환하는 과정이다. 두 개념 모두 최신 기능을 구버전의 실행 환경에서 동작할 수 있게 바꿔주는 역할을 한다. 폴리필 라이브러리로는 대표적으로 core.js, polyfill.io가 있고, 트랜스파일러로는 바벨(Babel)이 있다.
자바스크립트가 실행되는 환경으로, 대표적인 예시로는 크롬과 사파리 같은 인터넷 브라우저와 Node.js 등이 있다. 자바스크립트 런타임은 자바스크립트 엔진, Web API, 콜백 큐, 이벤트 루프, 렌더 큐 등으로 구성된다.
런타임(Runtime)
소스코드의 컴파일이 완료된 후 프로그램이 메모리에 적재되어 실행되기 까지의 시간
사용자 보안을 위해 브라우저 상에서 할 수 없는 일이 존재한다.
<input>
태그를 통해 파일을 선택하는 행위가 일어나야 한다. 카메라, 마이크 같은 디바이스 접근 시에도 사용자의 명시적인 허가가 이뤄져야 한다.일반적인 작업은 콜 스택에서 이루어진다. 시간이 소요되는 작업들은 WebAPI에서 대기 후 콜백 큐로 보내진다. 콜 스택이 비워져있을 때만 콜백 큐에 저장되어있던 작업들을 콜 스택으로 보낸다.
[출처:https://beomy.github.io/tech/javascript/javascript-runtime/]
구성 요소
매크로 태스크 큐:
자바스크립트의 이벤트 루프에서 사용되는 큐로, setTimeout, setInterval, 이벤트 핸들러 등에서 등록된 콜백 함수들이 순차적으로 실행되기 위해 저장된다. 동기 코드 실행이 끝난 후, 마이크로태스크 큐의 작업이 모두 처리된 후 이 작업들이 실행된다.
마이크로태스크 큐:
프로미스의 then, catch, finally 콜백이나 MutationObserver와 같이 빠르게 실행되어야 하는 작업들이 저장되는 큐이다. 현재 실행 중인 콜 스택이 비워진 직후, 태스크 큐보다 우선하여 처리되므로 비동기 작업의 결과를 보다 빠르게 반영할 수 있다.
Animation Frames:
브라우저의 requestAnimationFrame API를 통해 등록된 애니메이션 업데이트 함수들이 모이는 큐이다. 브라우저가 최적의 타이밍에 화면을 갱신할 수 있도록 도와주어, 부드러운 애니메이션 효과를 제공한다.
콜백 큐에는 태스크 큐, 마이크로태스크 큐, Animation Frames가 있으며, 실행 우선순위는 마이크로태스크>Animation Frames>태스크 순이다.
리액트와 같은 자바스크립트 프레임워크는 기본적으로 엄격모드로 동작한다.
"use strict";
var x = 1;
delete x; // 불가
"use strict";
function add(x) {
var a = 2;
b = a + x; // 불가
}
"use strict";
function add(x) {
console.log(this); // undefined
}
"use strict";
const array = [1, 2, 3];
for (num of array) { // const나 let으로 선언해야함
console.log(num);
}
자바스크립트의 모든 코드는 문 또는 표현식으로 구성되며, 표현식은 그 자체로 하나의 문이 될 수도 있다. 한편, 표현식은 평가되어 값을 생성하는게 그 역할의 전부이지만 문은 let, const, function과 같은 선언 키워드로 변수나 함수를 생성하고 if, for 문과 같은 제어문을 생성하여 프로그램 흐름을 제어하기도 한다.
문(statement)은 자바스크립트 엔진에게 내리는 명령으로 문이 실행됨으로써 프로그램이 동작한다. 문은 리터럴, 연산자, 표현식, 키워드 등으로 구성되며 세미콜론으로 끝나야 한다. (세미콜론은 필수는 아니다. ⇒ 자바스크립트 엔진이 스크립트 해석시 자동으로 붙여준다(세미콜론 자동 삽입 기능, Automatic semicolon insertion).
// 표현식이 아닌 문 => 값으로 평가될 수 없음
let x = 3 * 11;
// 표현식인 문
x = 33;
메서드 | 설명 | 옵션 | 비고 |
---|---|---|---|
log | 출력 | 개발 단계에서만 사용하는 것을 권장 | |
info | 정보 출력 | 개발 단계에서만 사용하는 것을 권장 | |
warn | 경보 | ||
error | 에러 (예상하지 못한 에러, 시스템 에러) | ||
assert | 조건이 false일 때만 출력 | ||
table | 테이블 형태로 출력 | 객체 출력 시 유용 | |
dir | 중첩 객체를 출력 | colors, depth | |
time ~timeEnd | time부터 timeEnd 사이의 코드 실행 경과 시간을 출력 | ||
count | 함수의 호출 횟수 출력 | 호출할 함수 내부에서 사용하며, countReset 으로 초기화 가능 | |
trace | 함수의 호출 경로를 추적 | 이벤트리스너, 비동기 호출 추적 시 유용 |