こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

テスト駆動 JavaScript :Internet Explorerにおける、名前付き関数式の実装

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