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 API —
window,documentнедоступны в Node.js;require,__dirnameне работают без специальной настройки в браузере. - Ожидание многопоточности — JS однопоточен. Тяжёлые вычисления блокируют UI. Используйте Web Workers или выносите в сервер.
- Путаница ES-версий — не весь синтаксис доступен во всех браузерах. Проверяйте caniuse.com или используйте Babel.