JavaScript: что такое и где работает

JavaScript — высокоуровневый, динамически типизированный, интерпретируемый (с JIT-компиляцией) язык программирования, изначально созданный для браузеров, а сегодня работающий также на сервере (Node.js), в мобильных и десктопных приложениях.

Зачем нужно

Понимание природы JavaScript — как он выполняется, в каких окружениях и с какими ограничениями — помогает правильно проектировать код. Различие между браузерным и серверным окружением определяет, какие API доступны, как обрабатывать асинхронность и что означает «однопоточность».

Где используется

  • Браузер: интерактивность, DOM-манипуляции, запросы к API
  • Сервер: Node.js — REST API, микросервисы, CLI-инструменты
  • Мобильные приложения: React Native, Ionic
  • Десктопные приложения: Electron (VS Code, Slack)
  • Serverless и edge functions (Cloudflare Workers, Deno Deploy)

Основной контент

Движок JavaScript

Движок = парсер + компилятор + интерпретатор + GC

Браузер        Движок
Chrome/Edge    V8
Firefox        SpiderMonkey
Safari         JavaScriptCore
Node.js        V8
Deno           V8

Однопоточность и Event Loop

// JavaScript однопоточный — одна задача за раз
// Асинхронность реализована через Event Loop

console.log('1');

setTimeout( => console.log('2'), 0); // macrotask

Promise.resolve.then( => console.log('3')); // microtask

console.log('4');

// Вывод: 1 → 4 → 3 → 2
// Microtask queue выполняется до macrotask queue

Браузерное окружение

// Объекты, доступные только в браузере
window.document    // DOM
window.location    // URL
window.history     // история
window.navigator   // информация о браузере
window.fetch       // HTTP-запросы
window.localStorage // хранилище

// Проверка окружения
if (typeof window !== 'undefined') {
  console.log('Это браузер');
}

Node.js окружение

// Объекты, доступные только в Node.js
process.env.NODE_ENV  // переменные окружения
process.argv          // аргументы командной строки
__dirname             // директория файла
__filename            // путь файла

const fs = require('fs'); // файловая система
const http = require('http'); // HTTP-сервер

// Проверка окружения
if (typeof process !== 'undefined' && process.versions?.node) {
  console.log(`Node.js ${process.version}`);
}

Стандарт ECMAScript

ECMAScript — стандарт языка. JavaScript — реализация.
ES5  (2009) — строгий режим, JSON, Array.prototype.forEach
ES6  (2015) — let/const, стрелки, классы, Promise, модули
ES2017      — async/await
ES2020      — Optional chaining, Nullish coalescing, BigInt
ES2022      — at, Object.hasOwn, приватные поля класса

Частые ошибки

  • Смешение браузерного и Node.js APIwindow, document недоступны в Node.js; require, __dirname не работают без специальной настройки в браузере.
  • Ожидание многопоточности — JS однопоточен. Тяжёлые вычисления блокируют UI. Используйте Web Workers или выносите в сервер.
  • Путаница ES-версий — не весь синтаксис доступен во всех браузерах. Проверяйте caniuse.com или используйте Babel.

Связанные темы

Ресурсы