当涉及到浏览器如何加载数据并将其呈现给用户时,我认为我对异步/同步/提升非常了解。但是,以下示例使我陷入困境,让我发布示例,然后解释问题:
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
如果可能的话,谢谢。
答案 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")