2012-04-24 11 views
0

下のコードのようにクロージャを作成している返された関数を呼び出すことはできますか?クロージャJavaScriptを呼び出す

したがって、htmlにアクセスするときにBay.HTML()()を実行する必要はありません。 ?

Bay.prototype.HTML = function() { 
    var html; 
    return function() { 
     if (!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }(); <----------HERE 
}; 
+0

「それはいいですか」とはどういう意味ですか? – Zirak

+1

これは「OK」と思われますが、私の意見では複雑です。単にBayインスタンス(html this.html)にhtmlを添付して、内部クロージャと多くのコードをドロップするのはなぜですか? –

答えて

2

私はあなたが

Bay.prototype.HTML = (function() { 
    var html; 
    return function() { 
     if (!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }; 
})(); <----------HERE 

これは代わりに、瞬時にBay.prototype.HTMLが呼び出されるたびに、無駄な機能を実行する、Bay.prototype.HTMLに閉鎖から返される機能を割り当てて欲しかったと思います - ではありません実際にクロージャを作成します。

+0

私は、私が探していたことは、html変数を一度割り当てる方法であることに気付きました。その後は、html変数からデータが取り出され、関数が実行されません。本当に、私がやったのは、this._htmlプロパティをやっておき、プロトタイプを持っていて、ちょっと残酷すぎるようなHTML関数を残しておくことでした。 –

1

それは大丈夫ですが、それはあなたのHTMLがキャッシュされていないです意味

Bay.prototype.HTML = function() { 
    var html; 

    if (!html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     html = td; 
    } 
    return html; 
}; 

に何が違うのではないのです。

あなたがhtmlをキャッシュしたいなら、あなたは欲しい:

Bay.prototype.HTML = function() { 

    if (!this.html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     this.html = td; 
    } 
    return this.html; 
}; 
1

それはあなたが「OK」にするために何かをしたいれる文脈に依存します。それは動作しますか?そうであれば、時にはそのすべてが必要です。他の人があなたのコードを読んでいるかどうかは分かりますか?それは保守可能か、それは安全ですか?

だから、コード。それは動作しますか?いいえ

このプロトタイプ関数が呼び出されるたびに、メソッド変数 'html'はnullに初期化されるため、 内部関数の条件は常にtrueと評価され、dom要素を設定するステップを実行します。

ここでクロージャを使用する必要がありますか?いいえ

呼び出しコンテキストを超えて持続しない閉包を作成しているので、無駄です。 Bar.HTML()を呼び出すたびに、後で実行されるクロージャ自体への参照を格納したり返したりしないため、コードを実行するために余分なコンテキストを作成して破棄します。あなたはちょうど閉鎖を考慮し、より高性能の結果を得ることができます:もちろん

Bay.prototype.HTML = function() { 
    var html; 
    if(!html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     html = td; 
    } 
    return html; 
} 

、そのHTMLのVARとの声明が必要でない場合は、すぐそこに宣言されているが、私は、これは単にいくつかのサンプルコードであると仮定します。

closures in javascriptの便利な情報は、その使用方法と使用方法です。

0

@エセイリアが正しい。あなたの実装は、あなたが望むように結果をキャッシュしません。

彼のソリューションではキャッシュされますが、公開されます。キャッシュをパブリックにしないキャッシュバージョンが必要な場合は、間違った機能を評価しています。何が欲しいのです:

Bay.prototype.HTML = (function() { 
    var html; 
    return function() { 
     if(!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }; 
})(); 
+0

ありがとうございました!これはまさに私が探していたものです。説明/検証と並んで、したがって、現金化のバージョンはクロージャーに似ていますか? –

+0

※※クロージャーです。外部で評価された無名関数は、内部関数を除くすべての関数に返される内部関数のスコープを作成します。以前に行われていたことは、関数呼び出しの最後に外側のスコープが "死んでいた"ため、実際にはクロージャではありませんでした。 –

+0

もう一つ注目したのは、Bayの.HTMLプロパティがvarとして機能していると思っていたことです。これは、クロージャを作成してvar htmlに埋め込んだようです。しかし、実際には.HTML()は上書きされるたびに呼び出されました。複数のインスタンスを持つことができる関数で、キャッシュされた値を持つことが可能かどうかはわかりません。 –

関連する問題