-1

私はこれを持っています:

var field = query("form#"+form.id+" input[name='" + error.field + "']");
if(field.length){
  if( field[0].id ) {
    widget = registry.byId( field[0].id );
    if(widget){
    ...
  }
 }

私は私が書くことができると思ったでしょう:

var field = query("form#"+form.id+" input[name='" + error.field + "']");
if(field.length && field[0].id && widget = registry.byId( field[0].id) ){
...
}

しかし、2番目の「短縮された」形式を使用すると、Javascriptエラーが発生します。

申し訳ありませんが、JSFiddleを提供するのは面倒です。この問題は、query()が0の値を返す場合に発生します- field[0].id&&widget = registry.byId( field[0].id) はまだ解釈されていました。

私はそれを安全にプレイしていると思いました。2番目field[0].idはそうであった場合field.lengthにのみ発生し、> 0それが真実であるwidget = registry.byId( field[0].id)場合にのみ発生するからfield[0].id です...

私は何が欠けていますか?

メルク。

4

2 に答える 2

2

問題は、=演算子の優先度が演算子よりも低い&&ため、コードが次の結果を取得しようとしていることです。

field.length && field[0].id && widget

...そしてそれに値を割り当てます。割り当てを括弧で囲むことにより、これを回避できます。

if(field.length && field[0].id && (widget = registry.byId(field[0].id)) ){

(この小さなデモでは正常に動作するようです:http://jsfiddle.net/nnnnnn/4dAfS/

さらに読む:MDNのOperatorPrecedenceの記事

于 2012-08-14T06:48:06.963 に答える
1

RIGHTでメソッドUncaught ReferenceError: Invalid left-hand side in assignmentを評価し、LEFTでメソッドを割り当てようとしているためにエラーが発生する可能性がありますが、ブラケットを使用して左側の割り当てを制限していないため、エラーが発生したと見なされます。registry.byId()resultfield.length && field[0].id && widget

最後の条件を角かっこで囲むことにより、エラーを抑制することができます。 if(field.length && field[0].id && (widget = registry.byId( field[0].id)) ){

于 2012-08-14T06:36:36.193 に答える