javascript - javascript控制台陷阱?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 是 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()
?
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
……两秒后……
eval("undefined") //Altough not really eval, but similar to it.
推荐阅读
- python - 如何实现 K-means (Python)?
- swift - 如何在 Swift 的 TableView Cell 中显示所有数据模型属性
- html - 树莓派服务器未在移动“谷歌”上正确显示网站
- javascript - 使用另一个文件中的函数,而不需要
- c++ - 如何在没有 UI 的情况下在 UE4 中生成景观?(按代码)
- arrays - 如何使用C语言中的数组方法从文本文件中读取数据并对特定列进行升序排序?
- c - C中函数的外部链接,可以不使用“extern”吗?
- javascript - 如何在类方法中使用函数?
- java - 2 括号内的匹配组
- python - 更改角色中的特定权限,discord.py 重写