2011-08-24 4 views
9

私はコードがwindowにアクセスするときに、それが最終的にwindowを見つけるために、スコープチェーンを上に移動する必要はありません引数変数の再割り当てのポイントは何ですか?

function Abc(a, b, c) { 
    var window = window; 

...何かなどを行うために(パフォーマンス上の理由のために)有用であることを認識しています。

function Scroller(elm, dw, settings) { 
    ... 
    var elm = elm; 
    var dw = dw; 
    ... 

再初期化の利点は何ですか...同じことが

... documentnavigator、等のために行うことができますしかし、私はMobiScroll jQuery pluginの一部を書き換える処理でだとこれを見つけましたelmdwは引数変数を指していますか?

私はコストがかかるargumentsへのアクセスについて多くを読んで、これは良い習慣であるかもしれない理由について何を読んたことがありません。

これを行う利点は何ですか?過去には

、私はMDNのドキュメントからdeliberately removedこの構造をしました。コードウィンドウにアクセスしたときに

+0

見たことがありません。エンジンに「最適化」について心配してもらいましょう。 –

+0

@pst私は同意します。しかし、私は好奇心を持っています... – alex

+1

多かれ少なかれ[Javascript - 関数のパラメータで定義された変数を再割り当てするときに 'var'を使う必要がありますか?](http://stackoverflow.com/questions/2495174/javascript-do-i-eed -to-use-var-when-reassigning-a-variable-in-the-fu)を使用します。しかし、私はこれらがあなたが望む答えかどうかはわかりません。 –

答えて

2
> function Abc(a, b, c) { 
>  var window = window; 

だから、それは最終的にウィンドウを見つけるために、スコープ チェーンを行く必要はありません。

私はそれが理由だとは思いません。グローバルスコープで宣言された関数の場合、識別子をローカルまたはグローバルに解決することは、非常に高速です(ブラウザによっては遅くなる可能性があります)。

スクリプトは、例えば、ウィンドウは、スコープチェーンに期待ウィンドウ対象としないいくつかの他のウィンドウ指す確実にするために、上記と同様のものを使用することができます2番目の例では

var fn = (function(window) { 

    // In here window is unequivocally a reference to the global object 

}(this)); 

:変数の宣言

> function Scroller(elm, dw, settings) { 
>  ... 
>  var elm = elm; 
>  var dw = dw; 
>  ... 

は完全な時間の無駄です。関数宣言や式の仮パラメータ・リストに識別子を入れることは、の変数でlocallingを宣言することと同じです。そのような識別子をローカル変数として宣言することは何の効力も持ちません。

は値が渡されなかった仮パラメータとの問題があったのSafariの初期バージョンがありましたが、それは長い時間前だったと1つの非常に具体的なケースでは唯一の問題でした。それだけで余分なコードを追加することに、その後

+0

+1 RobGに感謝します。これはすばらしい答えです。 – alex

+2

答えの最初の部分について:はい、グローバル関数の場合、大きな違いはありません。しかし、多くの場合、関数は他の関数にネストされ、コールバックなどとして使用されます。できるだけ近いオブジェクトを取得するのが理にかなっています。また、特定のオブジェクトにアクセスする頻度*にも依存します。経験則では、プロパティまたはオブジェクトに複数回アクセスする場合は、ローカル変数に格納します。 –

+0

@Felix King私はその経験則をまったく使用していません - 私の経験則は "...コードをより読みやすく/保守しやすいものにすれば、"パフォーマンスとは何も関係ありません。 "または"カウント "。 –

0

唯一の論理的な理由が潜在的変数がで宣言されたものの範囲を明確されています。

その他。

関連する問題