【问题标题】:What does a return statement do inside a setter?return 语句在 setter 中做了什么?
【发布时间】:2014-12-22 07:21:33
【问题描述】:

我有以下代码:

var o = {};
o.a = 1;

var _value = 1;
Object.defineProperty(o,"a",{
    set: function(value){
        _value = value + 1;
        console.log("log: ", value, _value);
        return _value;
    },
    get: function(){
        return _value;
    }
});

在 setter 方法中,我在返回之前将 _value 加一。所以如果我设置o.a = 5,我希望控制台打印6(即使我意识到从setter返回一个值通常没有意义)。然而,如下面的 sn -p 所示,控制台打印出5

> o.a = 5;
log: 5 6 // from console.log;
5 // return; why does it == value and not value + 1?
> o.a;
6
> var i = o.a = 5;
> i;
5
> o.a;
6

所以我的问题是为什么它返回 5 而不是 6

我希望这不是因为我在代码中犯了一些愚蠢的错误。

【问题讨论】:

  • 就像@Thilo 所说,在 setter 中返回不起作用。你可以把return 100而不是return _value放在setter中,你不会得到100而是只有5(分配给i的值)

标签: javascript expression variable-assignment getter-setter


【解决方案1】:

您不能从属性设置器返回任何内容,而只是获取分配的值(即5,因为您分配了5)。

setter 中的 return 有什么作用?

什么都没有。最好删除 return 声明。充其量它会被忽略。

【讨论】:

    【解决方案2】:

    让我们看看simple assignment

    11.13.1 Simple Assignment ( = )

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

    1. lref 为评估 LeftHandSideExpression 的结果。
    2. rref 成为评估 AssignmentExpression 的结果。
    3. rvalGetValue(rref)。

    所以rval 被分配了要分配给左侧的值(o.a)。在你的情况下5

    1. 如果以下条件都为真,则抛出 SyntaxError 异常:[...]
    2. 致电PutValue(lref, rval)。

    这是将值分配给左侧 (PutValue(o.a, 5)) 的位置。如您所见,PutValue 返回的任何内容都没有做任何事情(它不返回任何内容)。

    1. 返回rval

    它简单地返回分配的值,在您的情况下为5


    赋值表达式总是返回被赋值的值。

    【讨论】:

    【解决方案3】:

    赋值表达式的值总是等于被赋值的值:

    var a;
    console.log(a = 7); // logs 7
    

    无论您分配的对象是变量、普通属性、setter、只读属性还是其他任何东西,这都是正确的:

    var a = {};
    Object.defineProperty(a, "b", { value: 8, writable: false });
    console.log(a.b = 9);  // logs 9
    console.log(a.b);      // logs 8, because a.b is read-only
    

    正如您自己所说,setter 中的返回值是没有意义的,所以当您在 setter 中使用返回值时,您为什么期望它实际上做一些特别的事情?回答您的问题“return 语句在 setter 中做了什么?” - 基本上没有。它计算 return 右侧的表达式,然后丢弃结果。

    【讨论】:

    • 这个答案解决了问题中提出的两个问题,而不仅仅是明确的问题。
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2023-01-27
    • 2013-11-23
    • 2016-10-17
    • 2022-01-19
    • 2011-08-27
    相关资源
    最近更新 更多