Ответ
Namespaces в JavaScript (или TypeScript) позволяют организовывать код в логические группы, предотвращая конфликты имен. Они особенно полезны в глобальной области видимости.
Пример с TypeScript:
namespace MyUtils {
export function log(message: string) {
console.log(message);
}
}
MyUtils.log("Hello"); // Работает
log("Hi"); // Ошибка: функция не найдена
Особенности:
- Инкапсулируют код, делая его доступным только внутри namespace
- Могут быть вложенными
- В современном JS/TS часто заменяются модулями (import/export)
- В TypeScript компилируются в IIFE (самовызывающиеся функции)
Ответ 18+ 🔞
Смотри, вот тебе про эти ваши namespace'ы в JavaScript, а то народ путается, как последние идиоты. Ну, в TypeScript, если точнее, но суть одна.
Представь, что у тебя в проекте бардак, как в моей голове после пятницы. Функции, переменные — всё летает в глобальной области, как мухи на говне. Один назвал функцию log, другой тоже log, а третий, пидор, ещё и log — и пошла пиздёж, всё сломалось, потому что имена конфликтуют.
Так вот, namespace — это такой ящик, куда ты можешь сложить свой код, чтобы он не мозолил глаза другим. Как будто ты в общежитии живёшь и пишешь на своей зубной щётке «НЕ ТРОГАТЬ, СУКА!».
Вот смотри, как это выглядит:
namespace MyUtils {
export function log(message: string) {
console.log(message);
}
}
MyUtils.log("Hello"); // Всё работает, красота!
log("Hi"); // А вот тут — пизда! Ошибка, функция не найдена. Она же внутри ящика!
Ключевые моменты, чтобы не быть мудаком:
- Инкапсуляция, блядь. Всё, что внутри namespace, там и остаётся. Если не пометил
export— это твой личный секрет, как и то, что ты в детстве сосал сосульку с собачьей мочой. Никто снаружи не увидит. - Можно вкладывать, как матрёшку. Один namespace внутри другого. Получается овердохуища вложенность, но иногда так и надо.
- Сейчас это немного старовато. Все умные дяди теперь используют модули (
import/export). Это как перейти с лаптей на кроссовки. Но namespace'ы ещё живы, особенно в легаси-коде, который писал ваш дядя Ваня в 2015-м. - Под капотом в TypeScript это всё компилируется в какую-то хитрую хуйню — IIFE (самовызывающиеся функции), чтобы изолировать твой код по-настоящему.
Короче, namespace — это способ не обосраться с именами, когда проект растёт. Но если ты только начинаешь — смотри в сторону модулей, а то опоздаешь на поезд, как я на свою свадьбу.