コードレビューをしていて、未だに散見される悪夢がある。グローバルスコープを汚染し、意図せぬ変数の上書きによって引き起こされる、再現性の低い偶発的なバグだ。
「なぜ動かないのか分からない」「別ファイルのスクリプトで書き換わっている」。
モダンなフロントエンド開発において、このようなプリミティブなスコープ汚染で時間を溶かすのはもう終わりにしよう。
今回は、ブラウザの伝統的な `
この場合、`api.js` で `let` や `const` を使わずに(あるいはうっかり `var` や変数名漏れで)宣言された変数は、すべてグローバルオブジェクトのプロパティ、あるいはグローバルLexical Environmentの最上位にブチ込まれる。
// api.js
var globalApiEndpoint = "https://api.example.com/v1";
// これはお行儀悪く window.globalApiEndpoint になり、どこからでも書き換え可能になる
V8のヒープメモリ上において、これらはアプリケーションが終了するまでガベージコレクション(GC)の対象外となり、メモリ効率の観点からも最悪のアンチパターンだ。
---
2. ES Modules (`type="module"`) によるスコープの完全隔離とV8の挙動
ここで救世主となるのが `