2

短い質問:

jQuery が含まれているとしましょう。この関数はより速く実行されますか...

var example1 = (function($, jQuery) {
    return function() {
        // do something
    }
})()

...次のものより:

var example2 = (function() {
    return function() {
        // do something
    }
})()

?

最初のものでは jQuery オブジェクトは になりundefined、2 つ目では継承されます。では、2 番目のものはより高価なはずですか?

速度を向上させ、パフォーマンスを低下させる継承された変数を取り除く最良の方法は何ですか?

jsPerf テスト: http://jsperf.com/objinheritance

4

1 に答える 1

3

ECMAScript で定義されているように、参照の解決は内部から外部へのルックアップ プロセスであるため、最初の例では、$変数はコードから1 ステップ$離れており、2 番目の例では、グローバル スコープ内に存在しますが、少なくとも2 ステップ離れています。 、余分なルックアップ オーバーヘッドが発生します。

ただし、現実の世界では、最新の JavaScript エンジン (V8 など) は、 ECMAScriptが述べているのとまったく同じ方法で参照解決を実装していません。つまり、ほとんどのコードでは、すべての変数を単一のステップで参照され、ルックアップのオーバーヘッドはまったくありません。

結論:それらは互いに本当に同じです。

PS:スコープ チェーンと同様に、javascript エンジンはプロトタイプ チェーンでもまったく同じ最適化を行うため、プロパティ ルックアップのオーバーヘッドについて心配する必要もありません。

于 2012-04-23T08:55:20.970 に答える