Про що мова?

Основа допису – репозиторій tc39 ECMAScript Explicit Resource Management з детальним технічним описом ключового слова using та мотивацією для чого варто його додавати у стандарт ECMAScript. Тут же я в двох словах без зайвого шуму поясню що це нам дає і які у цього потенцій перспективи.

Це щось нове?

Для світу javascript – так. Для інших МП – ні. У C# є також using(хто б сумнівався, що людина з Microsoft, автор нововведення, запропонує якесь інше ключове слово для JS), в Java є try-with-resource, у Python просто with, у Go defer, а у C++ паттерн RAII, який взагалі став одним зі стовпів в МП Rust.

Що це значить для кінцевого споживача, який пише просто бізнес логіку

Насправді зміниться не багато, по факту розробники бібліотек сховають більшість мануальних степів під капот. Найпростіший, потенційний, приклад, це відкриття/закриття нового з’єднання з БД

// раніше
function doSomethingWithDB(...params) {
  const db = new DBConnection();

  // якась логіка, читання чи запис

  db.close(); // треба обов'язково закрити підключення, бо GC не закриває
}


// з ключевим словом using
function doSomethingWithDB(...params) {
  using db = new DBConnection();

  // якась логіка, читання чи запис

} // <-- кінець скоупу в якому було ініціалізовано підключення до БД

Тобто using каже, що після виходу зі скоупу необхідно виконати якусь дію, а у нашому умовному прикладі це неявний виклик функції, яка закриє підключення до БД і очистить памʼять.

Як цим користуватись і головне хто цим буде користуватись

Для того, щоб ваша функція змогла зреагувати на using і вихід зі скоупу вам треба відповідати всього одній вимозі – у вас повинно бути реалізоване поле з ключем Symbol.dispose

const myCoolFunc = () => {
  // якась логіка
  return {
    myField: "foo",
    myAnotherField: 1,
    [Symbol.dispose]() {
      // код, який буде виконаний під час виходу зі скоупу
    },
  };
};

Зараз у багатьох сучасних фреймворках є функції/методи/хуки життєвого циклу і поле Symbol.dispose це їх найближчий аналог, тому для більшості це не стане якоюсь магією.

Треба усвідомлювати, що першочергове застосування using разом з полем Symbol.dispose це неявне вивільнення ресурсів, які не очищаються самостійно за допомогою Garbage Collector, а це робота з файловою системою в Node-like середовищі, підключення до БД, робота з Web Sockets тощо. Тобто не варто зловживати і робити абстракції в яких потім не розібратись.

Замість висновків

Очікується, що основним користувачем будуть розробники бібліотек, а звичайні девелопери, лише замінять const на using у специфічних випадках, та і не будуть думати про те, чи вивільнили вони памʼять після того, як зробили потрібну операцію.