2012-01-19 2 views
8

私はHTML5 Canvasでいくつかのアニメーションをやっています。私は望ましいだろう、オブジェクトのメソッドを、アニメーション化するために探していた場合、パフォーマンスが賢明な(私はIE8を気にしないと仮定した場合):オブジェクトメソッドのsetTimeout - ES5バインドまたはクロージャ?

setTimeout(this.render.bind(this), 15); 

または

var self = this; 
setTimeout(function() { self.render() }, 15); 

私の特定のケースではありません実際に視覚的に違いを生み出すのに十分強い。私はベストプラクティスを見つけようとしています。

bindで新しい関数を作成すると、クロージャを作成するよりもオーバーヘッドが少なくなると思いますが、専門家に質問したかったのです。

+1

これは私にとっては最適化のような臭いがありますが、あなたの問題が何であるかはわかりませんが、この時間の75%は問題ではないと言います。 – mkoryak

+0

どちらもクロージャを作成しますこれらの関数は、次のようにバインドされています。 –

+2

@mkoryak - これ以上の作業をしているのであれば、過度の最適化に過ぎません。両方とも実装するのは簡単ではなく、どちらが(潜在的に)より性能が良いのか不思議に思っていました。 –

答えて

5

さまざまなエンジンが非常に異なるパフォーマンス特性を持つため、JavaScriptのパフォーマンスに関する質問は難しいです。あるエンジンで速いのは別のエンジンでは遅いです。

あなたの閉鎖は確かに非常に速くなければなりません。結局のところ、すべての関数はクロージャであり、変数はすぐに含まれるコンテキストで定義されています(そのため、スコープチェーンを調べることはほとんどありません)。

しかし理論的には、ES5機能をネイティブにサポートするエンジンは、bindの動作を最適化して、さらに高速化しました(1つのスコープチェーンのルックアップだけでなくても)。

重要ですか?いいえ、私はあなたに合ったものを使用します。 ES5機能とは異なり、bindは完全にES3コード  —のシムでエミュレートすることができますが、IE5はまだES5機能をネイティブに備えていない唯一のブラウザではありません。これを行うには、call/applyを使用する必要があります。これは、一部のエンジンのクロージャよりも遅くなる可能性があります)。