3

JavaScript setter 更新引用处的内部值,但返回值不正确。

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 ) 返回正确的值。此行为会忽略您的 setter 中发生的任何验证。

从规范:

产生式AssignmentExpression : LeftHandSideExpression = AssignmentExpression的评估如下:

  1. lref为评估LeftHandSideExpression的结果。
  2. rref为评估AssignmentExpression的结果。
  3. rval为 GetValue( rref )。
  4. 如果以下条件都为真,则 抛出SyntaxError异常:
    • 类型(lref)是 参考为
    • IsStrictReference( lref ) 为
    • Type(GetBase( lref )) 是环境记录
    • GetReferencedName( lref ) 是“ eval ”或“ arguments
  5. 调用 PutValue( lref , rval )。
  6. 返回rval

因此,按照设计,无法“解决”您的问题。检查Game.points应该足够了。

于 2014-01-23T01:47:24.323 回答