【发布时间】:2019-03-07 17:36:29
【问题描述】:
在控制台中运行以下代码时
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 是 timerid 所以我将我的代码重写为
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 控制台中进行了测试,结果相同
【问题讨论】:
-
一个突出的主要事情是 settimeout 的第一个参数应该是您在 T1 和 T3 中正确传递的函数。但是 T2 你没有传递一个函数,你传递的是一个函数的结果,因为它正在被立即评估。
-
setTimeout 返回计时器实例的 id....不确定您期望发生什么。您不能从异步调用中返回,并且您的代码没有返回任何内容......
标签: javascript console settimeout