2011-10-14 17 views
0

私は以前に選択した選択リスト項目に基づいて値を持つ選択リストに値を設定するajaxフォームを持っています。このフォームは3つの異なるビューで使用され、各ビューは特別な選択リストを追加します。私は、フォームプロセスを同期して保持し、ユーザーを混乱させない基本的な検証コードを書いています。javascriptで未定義の変数を持つ関数を実行することは可能ですか?

3つのフォームをすべて外部スクリプトファイルで処理する関数を作成しました。

私の質問: 私の変数のいくつかがフォームとビューに基づいて定義されていないと心配する必要はありますか?

ここに私の質問を示すサンプルコードがあります: 注:これは私の変数の実際の名前ではありません。要約する

(function ($){ 
    var objects = {sl1:$('#SelectList1'),sl2:$('#SelectList2'),sl3:$('#SelectList3'),lbl1:$('#Label1'),lbl2:$('#Label2'),lbl3:$('#Label3')}; 
    objects.sl1.change(function(){ 
    mapValues(); 
    } 
    function mapValues(){ 
    objects.lbl1.text(objects.sl1.val()); 
    objects.lbl2.text(objects.sl2.val()); 
    objects.lbl3.text(objects.sl3.val());//What if this select list is undefined for View1? 
} 
    })(jQuery); 

、ビュー#1はSelectList1 & SelectList2を持っています。ビュー#2にはすべて3があります。パフォーマンスの問題はありますか、変数のいくつかが未定義の関数を呼び出すことは悪い習慣ですか?

ありがとうございました。

答えて

2

これはJSの問題ではなく、jQueryの問題です。セレクタの空の結果に.text()または.val()のようなメソッドを実行すると、jQueryは何もしません(それでも失敗しません)。パフォーマンスの問題については、自分でテストしてください。要素が見つからない場合、要素が存在する場合と比較してパフォーマンスが少し良くなると思います。

したがって、このようなコードを使用することは有効です。

「未定義変数」と「利用できない要素」を混在させていることに注意してください。これはまったく別の問題です。未定義の変数を使用することは強く推奨されず、しばしば予期しない動作につながります。

+0

本当に素晴らしい答えがいくつかあります。私は、誰かが私の状況に基づいて、「利用できない要素」や「未定義の変数」に関連するコメントがあったかどうかを知ることに興味があります。私は実際に値をチェックするswitch文を使用しています。ちょっと気になっただけ。皆さんありがとう。 – trevorc

0

はい、これは悪い習慣です。そして、バグの原因です。

デフォルトの値を定義したり、関数内でそれをチェックしたりすることをお勧めします。

0

なぜあなたは||オペレータ

($('#SelectList1').length || '0') 
+1

この場合、 '$( '#SelectList1')。length'は決して定義されないか、nullになることはないので、必要ありません。 – Blazemonger

0

問題は不確実性のレベルを導入し、そうすることでバグを追跡するのが難しいことです。別のJSパーサは、違った反応をします。あるものはもっと寛容で何もせず、他のパーサーはちょうどクラッシュします。すぐにブラウザ間の問題が発生する可能性があります。

さらに、これらの変数がコード内で渡されるため、値がわからないとコードの残りの部分がどのように相互作用するかを予測するのが難しくなります。だから、あなたは潜在的なロジック/プログラムのバグも持っています。例えば、それらをデフォルトに割り当てる

だから、自分を支持を行うと、A)(必要なパラメータが渡されていることを確認し、それがないと、b)、オプションのパラメータは、すぐにあなたがそれらを受け取るように扱われていることを確認した場合の取り扱い、いくつかのエラーを行いますアプリケーションロジックに最適なものがあれば、定義されていなければ他の関数に渡されないようにしてください)。

1

この時点では、可読性とメンテナンス性の詳細について考えています。 View#1にSelectList1があることをあなたのJSで見ることによって、別の開発者にはっきりと分かりますか?& SelectList2?コードを見ると、すべてのフォームが同じJSを使用しているので、3つすべてがあると思うでしょう。個々のフォームがそれぞれのフォームに含まれるselectListsを指定できる場所に柔軟性を持たせることができます。グローバルスクリプトは、フォームで指定されたselectListsのみを使用しています。

+0

あなたの可読性がよく取り入れられています。 – trevorc

関連する問題