「なぜ今さら『use strict』なのか?」— 現場で生き残るためのスコープと変数の鉄則
やあ。現場でコードを書いていて、ふと「あれ、なんでここでエラーにならないんだ?」と首を傾げたことはないかい?
中級者レベルに差し掛かると、JavaScriptの「緩さ」が心地よくなる時期がある。だが、大規模なプロジェクトでその「緩さ」は、往々にして数時間〜数日かけてデバッグする地獄の入り口になるんだ。
今日は、現代のフロントエンド開発において「基礎中の基礎」でありながら、意外と真意が語られない『`use strict`(厳格モード)』が、スコープと変数管理にどういう「防波堤」を築いてくれるのか、そのリアルな現場の視点から紐解いていこう。
—
1. 暗黙のグローバル変数:フロントエンドの「時限爆弾」
まず、`use strict`を語る上で避けて通れないのが、この「暗黙のグローバル変数」だ。
JavaScriptの歴史的な経緯で、変数の宣言(`let`, `const`, `var`)を忘れて値を代入すると、JavaScriptエンジンは「ああ、グローバル変数として定義したいんだな」と勝手に解釈してオブジェクトのプロパティとして生成してしまう。
function calculateTotal() {
// ここで宣言を忘れると…
price = 1000;
return price 1.1;
}
calculateTotal();
console.log(window.price); // 1000 と出力される(汚染された!)
これの何が恐ろしいか分かるか? プロジェクトが大きくなればなるほど、どこで誰がこの変数を書き換えたのか追跡不能になる。`use strict`は、この「無責任なグローバル生成」を禁止する。宣言なしの代入には、即座に`ReferenceError`を投げてくれるんだ。
2. 厳格モードがスコープに与える変化
`use strict`を入れると、JavaScriptの挙動は「予測可能」なものに変わる。特にスコープに関しては、以下の点が重要だ。
- thisの指向: 非厳格モードでは、関数呼び出し時の`this`はグローバルオブジェクト(ブラウザなら`window`)を指していたが、厳格モードでは`undefined`になる。これは、意図しないグローバル汚染を防ぐための非常に強力な安全装置だ。
- with文の禁止: あれはコードの可読性を著しく下げ、最適化を妨げる。厳格モードでは問答無用で構文エラーになる。
- ブロックスコープの強化: もちろん、`let`や`const`の登場でブロックスコープは当たり前になったが、厳格モード下では`eval`内での変数宣言が外部スコープに影響を与えないなど、スコープの「密閉性」が高まる。
3. 実務で使える「防御的コーディング」サンプル
現場では、ES Modulesを使っていれば自動的に厳格モードが適用される。だが、レガシーなスクリプトや、特定の関数だけ保護したいこともあるだろう。そんな時の実装パターンを紹介する。
‘use strict’; // ファイルの先頭に書くのが基本中の基本
(function() {
// 即時実行関数(IIFE)の中に記述することで、
// 他のライブラリに影響を与えずに安全圏を作れる
let user = { name: ‘Alice’ };
function updateUserName(newName) {
// 厳格モードなら、宣言ミスを即座に検知できる
try {
// 誤って ‘user_name’ を宣言なしで書こうとするとエラーになる
user_name = newName;
} catch (e) {
console.error(‘宣言忘れをキャッチ:’, e.message);
}
}
updateUserName(‘Bob’);
})();
4. なぜ私たちは「厳格モード」を信じるべきか
正直な話、今のモダンな開発環境(WebpackやVite、Babelを通したビルド)では、意識せずとも厳格モードで動いていることが多い。だが、「システムが守ってくれている」と「自分で制御している」のとでは、エンジニアとしての地力に雲泥の差が出る。
僕からのアドバイスだ:
コードを書きながら、「もし今ここで`use strict`を外したら、このコードは壊れるか?」と自問自答してみてくれ。
- グローバル変数を書き散らしていないか?
- `this`に依存した危うい設計をしていないか?
- 変数のスコープを最小限に絞れているか?
これらを意識するだけで、君が書くコードの品質は一段階、いや二段階は上がるはずだ。JavaScriptの「緩さ」を甘受するのではなく、厳格モードという「規律」を使って、誰が読んでも予測可能な美しいコードを書いていこう。
現場からは以上だ。また何かあればいつでも聞いてくれ。応援しているよ。

コメント