「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 関数を読んでようやく思い当たったものだ。