JavaScript từng là đơn luồng (single-threaded). Nó chạy bằng cái gọi là event loop (vòng lặp sự kiện).
Event Loop có một công việc đơn giản – giám sát Call Stack (ngăn xếp gọi) và Callback Queue (hàng đợi callback). Nếu Call Stack trống, nó sẽ lấy sự kiện đầu tiên từ hàng đợi và đẩy vào Call Stack, điều này thực thi sự kiện đó.
JavaScript trong trình duyệt không hỗ trợ đa luồng trong event loop vì nó không cần thiết cho 99.999% các trang web. Event loop xử lý mọi thứ liền mạch.
Đối với các ứng dụng còn lại, lập trình viên có thể dùng Web Workers. Web Workers là phương tiện đơn giản để nội dung web chạy script trong các luồng nền (background threads). Luồng worker có thể thực hiện tác vụ mà không làm gián đoạn giao diện người dùng. Ngoài ra, chúng có thể thực hiện I/O bằng XMLHttpRequest (mặc dù responseXML và channel luôn null). Một khi được tạo, worker có thể gửi tin nhắn đến mã JavaScript đã tạo nó bằng cách post message đến event handler được chỉ định (và ngược lại).