2011-01-14 8 views
5

私はそれがきれいだと私は毎回それをするので、私はそれを毎回行う。私は下にそれらを使用するために上の変数を宣言します。私はそれらを一度だけ使用してもそれを行います。ここでこれは私がここでやっている悪いJavascriptの練習ですか?

は(jQueryフレームワークを使用して)の例である:

$("#tbListing").delegate("a.btnEdit", "click", function(e) { 
    var storeId = $(this).closest("tr").attr("id").replace("store-", ""), 
     storeName = $(this).closest("tr").find("td:eq(1)").html(), 
     $currentRow = $(this).closest("tr"); 

    $currentRow.addClass("highlight"); 

    $("#dialogStore") 
     .data("mode", "edit") 
     .data("storeId", storeId) 
     .data("storeName", storeName) 
     .dialog("open"); 

    e.preventDefault(); 
}); 

私もPHPでそれを行う傾向にあります。私がそれをするのはメモリがそれほど効率的ではないと思ったら私は正しいでしょうか?

編集:ありがとうございました。あなたはすべての良い答えがあります。そのコード最適化について今すぐ。今はいいですか?

+1

繰り返す$(this).closest( "tr")避けることができました;) –

+0

私は次のようなコメントが欲しくない:情報を「id」属性などに格納するか、オブジェクトを使用してデータに情報を1回だけ格納する必要があります。私はそれがメモリ/ブラウザの許可されたメモリにどれだけ悪いのか知りたいだけです。 – Cybrix

+0

@キャスパー、うん、私はそれを知っている。変数に '$(this).closest(" tr ")を格納するだけで済むので、jQueryは毎回DOMを実行する必要はありません。 :P – Cybrix

答えて

12

申し訳ありませんが、一度使用しても変数を宣言することができますか?

絶対に!変数を使って物事を正しく命名すると、コードが100万倍も読みやすくなります。読みやすさが主な関心事でなければなりません。メモリ効率は、問題があると判明した場合にのみ問題になるはずです。

クヌースが言ったように、我々は小さな効率を忘れるべきで

は、約97%の時間で言う:時期尚早の最適化は諸悪の根源です。

あなたではなく、彼らが最初に使用されている場合よりも、関数の先頭で変数を宣言についての詳細を求めている場合は、その後、Emmett has it right - クロックフォードはスコープ関連の混乱を避けるために、JavaScriptでこれを行うことをお勧めします。それはPHPでそれが価値があるかどうかは私が言っている純粋に主観的な質問ですが、あなたのPHPとJSのコーディングスタイルを維持することには何も問題はありません。


つ以上のCS(アベルソンからとサスマンのSICP)引用:

プログラムが実行するマシンのためだけついでに読むために人々のために書かれた、としなければなりません。

+1

70%で97%。今ではもっと99.97% –

+0

なので、メモリ効率は常にその性質上問題であるため、メモリ効率については心配する必要があります。確かに読みやすさは機能していますか? – benhowdle89

+0

@Marcoとても良い点。 – Skilldrick

6

これは悪いことではありません。

varステートメントは、関数本体の最初のステートメントである必要があります。


JavaScriptが ので は、他のCファミリー 言語の経験があるプログラマーを混乱することができ、ブロック内で変数を定義し、ブロックスコープを持っていません。関数の先頭にあるすべての変数を に定義します。上部の変数を宣言

http://javascript.crockford.com/code.html

+5

誰もが、この特定の点については特にCrockfordは言うすべてに同意しない。私は確かにしません。 –

+0

@Tim変数を定義する場所はどこですか? – Emmett

+0

Eh?与えられたコード例では、 'var'文*は関数本体の最初の行です。 – Spudley

2

行うには良いことです。コードを読みやすくします。あなたの特定の例では、$(this).closest( 'tr')を変数に置き換えることができますが、一般的には説明的な変数名を持つコードが非常に読みやすくなります。

1

nah、あなたはまさに正しいことをしていると思います。

@Caspar氏によると、$currentRowを最初に設定し、他の2行に$(this).closest("tr")の代わりにそのコードを使用することで、コードを単純化することができます。あなたが改善できるいくつかのことがあるかもしれません。しかし、あなたがそれをやったやり方と同じように、関数の初めにヴァールを設定することは、絶対に良いことです。

これは関数内で実行したために便利なので、関数の終わりに捨てられるというローカル変数なので、そこでのメモリ使用は問題になりません。

グローバルバールとして設定した場合、それはもっと問題になっているかもしれませんが、それでも正直言っても、既存のオブジェクトへのポインタを設定しているだけなので、 (それは良いではないグローバルな名前空間を汚染していますが)

+0

+1ありがとうございます。ありがとうございます。あなたはローカル変数であるため、実行後に破棄されることを指定しました。私はそれを考えましたが、わかりませんでした。 – Cybrix

+0

**あなたが改善できるいくつかのことを知りたいです**。私は自分の質問を編集し、それを最適化したバージョンを含めました。それを見て心ですか? – Cybrix

関連する問題