3

JavaScript セッターは参照時に内部値を更新しますが、戻り値が正しくありません。

var Game = 
{   
    get points() {
        return this._points;
},

    set points(x){        
       x = Math.min(x,25);

       this._points = x;   
       return this._points;
    }
};

Game.points = 10 ;

console.log(Game.points); // outputs 10

var updatedPoints = (Game.points = 60);

console.log(updatedPoints); // outputs 60
console.log(Game.points); // outputs 25

「updatedPoints」の期待値は 25 でした!

なぜこれが起こっているのでしょうか?これを修正する方法があるかどうかを提案できますか?

これを修正する理由: JS コードが期待どおりに動作することを確認するため、保守性!

4

1 に答える 1

6

JavaScript の単純な代入 ( ) は、仕様 ( 11.13.1= )に従って正しい値を返します。この動作は、セッターで発生する検証を無視します。

仕様から:

プロダクションAssignmentExpression : LeftHandSideExpression = AssignmentExpressionは次のように評価されます。

  1. lrefをLeftHandSideExpressionの評価結果とします
  2. AssignmentExpressionを評価した結果を rref とします
  3. rvalを GetValue( rref )とします。
  4. 次の条件がすべて真の場合、 SyntaxError例外をスローします。
    • Type( lref ) は Reference がtrue
    • IsStrictReference( lref ) は真です
    • Type(GetBase( lref )) は環境レコードです
    • GetReferencedName( lref ) は、「eval」または「arguments」のいずれかです
  5. PutValue( lref , rval ) を呼び出します。
  6. rvalを返します。

そのため、問題を「修正」する方法は仕様上ありません。チェックGame.pointsで十分なはずです。

于 2014-01-23T01:47:24.323 に答える