JavaScript控制台陷阱?控制台中的setTimeout返回的值是什么?

时间:2019-03-07 17:36:29

标签: javascript console settimeout

在控制台中运行以下代码时

var ajout1 = function(number) {
  number = number || 100;
  console.log(number + 1);
}

setTimeout(ajout1, 1000);
setTimeout(ajout1(500), 2000); // evaluates immediately and returns nothing but this is "by design" to show how NOT to write your timeout
setTimeout(function() {
  ajout1(1000)
}, 3000);

一个人可能期望得到以下结果

t+1: 101
t+2: 501
t+3: 1001

如果您仔细观察,您会发现t2将被立即求值,因此不会等2秒再返回。 (这是“设计使然”。它教(我)如何不写超时)。因此,预期的输出将变为:

t+0: 501
t+1: 101
t+3: 1001

实际上我真正得到的是

t+0: 501
t+0: <X
t+1: 101
t+3: 1001

X的价值不断增长。 我认为X是一个时间限制,所以我将代码重写为

var t1=setTimeout(ajout1,1000);
var t2=setTimeout(ajout1(500),2000);// no good
var t3=setTimeout(function(){ajout1(1000)},3000);

现在的输出是

t+0: 501
t+0: <undefined
t+1: 101
t+3: 1001

如果我评估t1,t2,t3,则它们的值为X + 1,X + 2,X + 3。所以我猜我的下注X是计时器ID是正确的。 我的问题是,为什么控制台仅输出1个计数器id的值,而不是三个?为什么我会返回“未定义”的值。

我在Chrome和Edge控制台中测试的结果相同

1 个答案:

答案 0 :(得分:1)

您第二个setTimeout()中发生了什么?

setTimeout(ajout1(500)/*evaluates immediately and returns nothing*/,2000);

然后,该代码如下所示:

setTimeout(undefined,2000); //undefined, because ajout1(500) didn't return anything

然后

setTimeout("undefined",2000); //Coerced to string

...以及2秒后...

eval("undefined") //Altough not really eval, but similar to it.