11

これは機能しているようで有効ですが、これを行うべきではない理由はありますか?コードを1行節約でき、変数とテキスト領域の値を設定できます。

$('#price').val(default_price = 2.9);

これと同等です:

default_price = 2.9;
$('#price').val(default_price);
4

3 に答える 3

18

これは、まったく異なることを行うコード内に1つのことを行うコードを埋め込みます。

特に、デフォルト値や「定数」などについて話している場合、初期化とUIの相互作用を混同すると混乱が生じます。それらを別々に保ちます-見つけて維持するのが簡単です。

技術的には同じことです。認知的にはそうではありません。

ovは、グローバルな名前空間汚染の懸念を引き起こします。任意の場所で変数を宣言することにより、値を上書きしたり、識別子を太くしたり、作業を複製したりする可能性が高くなります。

分離が難しいバグを作成することに加えて、これは追加の認知的負荷です。宣言された変数のスコープを理解し、他に使用できる場所を見つける必要があるためです。

于 2012-09-09T22:26:19.930 に答える
9

このような構成は特定の場合には受け入れられるかもしれないが、特にこの例には他の文体の問題があるため、これは受け入れられないという考えを楽しませます(最大のものは「魔法の数はどこから来るのか」です)

IMOの主な関心事は、変数が宣言されているかどうかです-単純に宣言することはできません

$('#price').val(var default_price = 2.9); //nope

また、元のコードがまだ宣言されていない変数で使用されている場合、グローバルスコープを汚染することになります。ただし、変数宣言されている場合は、「なぜ正しいデフォルト値で宣言されていないのか」というフォローアップの質問が表示されます。あるいは、魔法の数は(未知の)状態に応じて異なる可能性があります:

if (/*whatever*/) {
  $('#price').val(default_price = 2.9);
} else {
  $('#price').val(default_price = 9522); //over 9000
}

繰り返しになりますが、の値の設定は条件付き(またはステートメント)#priceの外部で実行されるべきであるため、これはスタイル的に貧弱です。switch

if (/*whatever*/) {
  default_price = 2.9;
} else {
  default_price = 9522;
}
$('#price').val(default_price);

変数セッターがオーバーライドされて、割り当てられた値以外のものを返すという複雑なケースが発生する可能性があります。これは、そもそもIMOでは少し疑わしい方法です。

于 2012-09-09T23:14:22.437 に答える
3

私はあなたのようにそれを使用しません-私は常にオブジェクトがコレクションとして特異値を格納することを好むので、すなわち:

var defaults = {
  "price" : 2.9
};

(この理由は、よりエクスポート可能で移植性が高く、JavaScriptを使用すると、変数が作成された後、変数を適切に削除する方法がないためです。オブジェクトから必要な数のキーを削除できます)

しかし、私はあなたがしていることをかなり使っていますif statements。それについて不平を言うコーダーはたくさんありますが、私にとっては、何かの結果を変数に割り当てて(それから存在をテストしています)、同じ中で使用することif blockは完全に理にかなっています、そして私の目にはすべてが同じ領域にあるため、より読みやすいコード:

var view;

if ( (view = someClass.thatChecksAndLoads('a view')) ) {
  /// do something with the view
}

上記は、オブジェクトに到達するための複数の方法がある状況に適しています。viewたとえば、次のようになります。

if ( (view = someClass.thatChecksAndLoads('a view')) ) {
  /// do something with the view
}
else if ( (view = anotherWay.toLoad('a view')) ) {
  /// do something here instead
}

ちなみに、誰かが疑問に思っている場合に備えて、上記の理由なしに余分な括弧を入れているだけではありません。かなりの数のJavaScriptコンパイラー(およびActionScriptコンパイラーも)は、ifステートメント内に単一の「=」がある場合にエラーを文句を言う/ログに記録します。割り当てを角かっこで囲むことにより、通常はチェックを回避するか、少なくとも警告の発行を停止することで、「==」を意味する場合に備えて役立つように努めているためです。

于 2012-09-09T22:38:34.633 に答える