JavaScriptのWith文を使っちゃいけない訳

JavaScript: The Good Parts」の中で「With文使うんじゃねぇよ、ボケ!」と怒られたことは覚えているのだけれど、この前唐突に理由を聞かれて思い出せなかったのでおさらいしておく。

理由:with文の中で該当しないプロパティやメソッドを呼ぶと、プロトタイプをさかのぼって探しに行くから。

サンプル1

p3は存在しないはずなんだけど、プロトタイプをさかのぼって外側の変数p3を呼び出しちゃう。
プロパティへの代入や、メソッドの呼び出しを間違えるとさらに悲惨。

サンプル2

modalオブジェクトのcloseメソッドを呼び出したはずが、タイポしているせいで正しく呼ばれず、プロトタイプをさかのぼって探した結果、最終的にwindow.close()が実行されて、ブラウザウインドが閉じる orz

場合によっては、非常に見つけにくいバグの温床となることがあるので、with文を使うときは重々注意して使いましょう。