「5.3.6 再び関数式について」において、Internet Explorerにおける、名前付き関数式のひどい実装のことが言及されている。
Internet Explorerは、名前付き関数式を前にすると、2つの別々の関数オブジェクトを作り、識別子を外側のスコープにリークし、そのうち1つをホイストしてしまう。
イメージとしては、名前付き関数式と同内容の関数宣言を外側のスコープで行ったようなものなのかな。
ひどさの詳細は、p.102〜p.103 のコードを読めばわかるとして。
これを回避する方法として
私は、必要に応じて分岐が異なれば名前も変わるようにして、クロージャー内の関数宣言を使い、名前付き関数式を避けるようにしている。
とかかれているが、その例となるコードまでは書かれていない。
おそらく次の様なコードだと思う。
名前付き関数式を使った実装
IE で予想しない振る舞いになる、と、この節に書かれているコード
if (!String.prototype.trim) { String.prototype.trim = function trim() { return this.replace(/^\s+|\s+$/g, ""); }; }
クロージャと関数宣言を使った実装 (Internet Explorerにおける名前付き関数式の予期しない振る舞いを避けるため)
if (!String.prototype.trim) { String.prototype.trim = (function () { function trim() { return this.replace(/^\s+|\s+$/g, ""); } return trim; }()); }
ちなみにこの実装は、p.119 リスト6-16 namespace 関数を読んでようやく思い当たったものだ。