javascript设置超时不起作用

javascript设置超时不起作用,javascript,Javascript,我希望下面的代码片段在每1秒暂停一次后打印出控制台日志 但是代码片段会立即执行(尽管打印了100次),并有以下输出 有人能告诉我我做错了什么吗 设i=0; 对于(;i

我希望下面的代码片段在每1秒暂停一次后打印出控制台日志

但是代码片段会立即执行(尽管打印了100次),并有以下输出

有人能告诉我我做错了什么吗

设i=0;
对于(;i<100;i++){
setTimeout(console.log(“测试”),1000;
}
log('Loop Done');

log('i的值==>'+i)
正如我在评论中提到的,您正在立即调用
console.log
,而且
setTimeout
是异步的,因此它是非阻塞的

正确的方法之一是

for (let i = 0; i < 100; i++) {
    setTimeout(() => console.log("test"), 1000 * i);
}
for(设i=0;i<100;i++){
setTimeout(()=>console.log(“测试”),1000*i);
}

您实际上是在为
控制台.log的
返回值设置超时,即
未定义
,而不是实际函数

setTimeout
需要一个
函数
作为第一个参数才能工作。您已通过未定义的
。要解决这个问题,有两种方法

传递一个调用控制台.log的函数 在ES6中,这要短得多:

setTimeout(() => console.log("test"), 100);
将参数绑定到
console.log
bind()
-ing参数到函数就像告诉函数使用我们给它的参数执行。调用
bind
时,函数不会立即执行,但会存储参数


另外,作为旁注,我们为
bind
传递的第一个参数,即
undefined
,是函数的
this
值。我们不关心
console.log的
this
值,我们只想通过
“test”
,我们将
未定义的
写入
this
值。

您正在立即调用
console.log
,而且
设置超时
也是异步的。你好,Aaron。请看我上次对你的代码做了什么。只需单击
并在保存告诉setTimeout之前单击tidy,即可执行
控制台.log
结果
100次。要挑剔,它确实应该是
控制台
,而不是
未定义
,因为
.log
在正常调用时是
控制台
的属性。
setTimeout(() => console.log("test"), 100);
setTimeout(console.log.bind(undefined, "test"), 100);