对象defineProperty混淆了我对提升/同步和异步js的思考方式

时间:2019-05-25 20:45:25

标签: javascript increment getter-setter

当涉及到浏览器如何加载数据并将其呈现给用户时,我认为我对异步/同步/提升非常了解。但是,以下示例使我陷入困境,让我发布示例,然后解释问题:

var obj = {
  counter: 0,
};

Object.defineProperty(obj, 'reset', {
  get: function() {
    return this.counter = 2;
  }
});

Object.defineProperty(obj, "increment", {
  get: function() {
    return this.counter++;
  }
});

Object.defineProperty(obj, "decrement", {
  get: function() {
    return this.counter--;
  }
});

console.log(obj.reset) //2
console.log(obj.increment + ' ' + "incremented") // "2 incremented"
console.log(obj.decrement + ' ' + "decremented") // "3 decremented"

认为 ,浏览器解释的方式是同步运行每一行代码,这些代码应产生:

//2
//2 incremented
//2 decremented

因为如果您一直跟踪“计数器”的更改,直到调用控制台日志为止,则计数器将从0更改为2,再更改为3,再更改为2。

然后我 思想 ,请稍等片刻;如果返回的值不是全部为2,则也许调用这些控制台日志是获取数据的异步方式,这从逻辑上使我认为结果应该是:

//2
//3
//2

因为如果在运行控制台日志时在何处访问“ counter”属性,则逻辑上,在(obj.reset)时,计数器值将从0更改为 2 < / strong>,然后 3(obj.increment) ,然后再次 2(obj.decrement)

对于浏览器如何解释这一点,我显然是错误的,并希望逐步清晰地说明返回值的原因:

//2
//2 incremented
//3 decremented

如果可能的话,谢谢。

2 个答案:

答案 0 :(得分:1)

您注意到了吗?

var cpt_A = 5;
var cpt_B = 5;

function func_A(){ return cpt_A-- } 
function func_B(){ return --cpt_B } 

console.log ( func_A() )   //  return 5.
console.log ( func_B() )   //  return 4.

这是C语言编程的基础。在func_A的情况下,它返回cpt_A的值,然后执行减量运算。在func_B的情况下,它对cpt_B进行减量运算,然后返回结果。

答案 1 :(得分:1)

这与异步无关。 console.log正在接收表达式,并且正在打印该值。 obj.increment返回2,因为postfix ++运算符就是这样工作的。它增加数字并在增加之前返回值。因此,最终成为

console.log(2 + ' ' + "incremented") 

console.log()方法最终得到字符串2 incremented。相同的逻辑适用于decrement。表达式变为console.log(3 + ' ' + "decremented")