Object defineProperty 混淆了我对 hoisting / sync 和 async js 的思考方式

Object defineProperty confuses the way I think about hoisting / sync and async js

当谈到浏览器如何加载数据并将其呈现给用户时,我认为我对异步/同步/提升有很好的理解。然而下面这个例子让我陷入了循环,让我 post 这个例子然后解释问题:

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

因为如果您一直跟踪对 'counter' 的更改,直到调用控制台日志,计数器将从 0 变为 2 再变为 3 回到 2。

然后我等一下;如果返回的值不全是 2,那么调用这些控制台日志可能是一种获取数据的异步方式,这在逻辑上会让我认为结果应该是:

//2
//3
//2

因为如果您在 运行 控制台日志时访问 'counter' 属性,那么逻辑上计数器值将从 0 变为 2 在 (obj.reset) 之后 3 在 (obj.increment) 然后 2 在 (obj.decrement)

我对浏览器如何解释这个的方式显然是错误的,并且想要一个明确的逐步解释为什么返回的值是:

//2
//2 incremented
//3 decremented

如果可能的话,谢谢。

你注意到了吗?

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的情况下returns是cpt_A的值,然后进行自减运算。在 func_B 的情况下,它对 cpt_B 进行递减操作,然后 returns 结果。

这与异步无关。 console.log 正在接收表达式并打印该值。 obj.increment returns 2 因为这就是 postfix ++ 运算符的工作方式。它在递增之前递增数字和 returns 值。所以,它最终是

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

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