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