자바스크립트는 non-blocking, asynchronous with single threaded 언어라고 한다. 여기서 먼저 Async vs Sync, Blocking vs Non-blocking의 차이를 먼저 알아볼 필요가 있다.
사진에서 보이듯이, 비동기(Async)의 경우 다른 하함수를 호출한 뒤, 자신의 작업을 계속 진행한다. 하지만 동기(Sync)의 경우 호출 받은 함수가 끝나고 응답을 보내줄 때까지 아무 일도 하지 않는다. 컴퓨팅적 언어로 표현하자면, 호출한 함수의 작업 완료 여부가 다른 함수에 영향을 미치는가의 차이이다.
블로킹과 논블로킹의 차이는 제어권을 넘기느냐 마느냐이다. 블로킹의 경우, 다른 함수를 호출하면서 제어권을 넘기게 된다. 제어권을 넘긴 함수는 제어권이 넘어가있는 동안 코드를 멈추고 제어권을 기다린다. 하지만 논블로킹의 경우, 다른 함수를 호출해도 제어권은 항상 가지고 있다. 때문에 다른 함수를 호출한 뒤에도 자신의 코드를 계속 진행한다.
텍스트만 보면, 동기 = 블로킹, 비동기 = 논블로킹 처럼 보일 수 있다. 하지만 위에서 언급했듯이, 동기와 비동기를 나누는 기준은 호출한 함수의 완료 여부가 미치는 영향이고 블로킹과 논블로킹을 나누는 기준은 제어권의 행방이다. 따라서 동기이면서 논블로킹, 비동기이면서 블로킹인 경우가 생길 수 있다.