【发布时间】:2026-01-14 00:05:01
【问题描述】:
当谈到浏览器如何加载数据并将其呈现给用户时,我认为我对异步/同步/提升有很好的理解。然而,下面这个例子让我陷入了一个循环,让我发布这个例子然后解释这个问题:
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
因为如果您在运行控制台日志时访问“计数器”属性的位置,那么从逻辑上讲,计数器值会在 (obj.reset) 时从 0 变为 2 然后 3 on(obj.increment) 然后 2 on(obj.decrement)
我对浏览器如何解释这一点的方式显然是错误的,并且希望清楚地逐步解释为什么返回的值是:
//2
//2 incremented
//3 decremented
如果可能的话,谢谢。
【问题讨论】:
-
这与异步或提升无关,只是后增量和后减运算符的工作方式。
标签: javascript increment getter-setter