我希望下面的代码片段在每1秒暂停后打印出控制台日志。
但是代码片段会立即执行(打印100次,但),输出如下。
有人能告诉我我做错了吗?
let i = 0;
for (; i < 100; i++) {
setTimeout(console.log("test"), 1000);
}
console.log('Loop Done');
console.log('Value of i ==>' + i);
答案 0 :(得分:1)
正如我在评论中提到的那样,您正在立即调用node
,并且console.log
也是异步的,因此它是非阻塞的。
正确的方法之一是
setTimeout
答案 1 :(得分:1)
您实际上是为return
console.log
值设置超时,即undefined
,而不是实际功能。
setTimeout
需要function
作为第一个参数才能使其正常工作。您已通过undefined
。要解决这个问题,有两种方法。
console.log
setTimeout(function () {
console.log("test");
}, 100);
在ES6中,这会短得多:
setTimeout(() => console.log("test"), 100);
console.log
setTimeout(console.log.bind(undefined, "test"), 100);
bind()
- 函数的参数就像告诉函数使用我们提供的参数执行一样。当您调用bind
时,不会立即执行该函数,但会存储参数。
另外,作为旁注,我们为bind
传递的第一个参数,即undefined
,是函数的this
值。我们不关心this
的{{1}}值,我们只想传递console.log
,我们将"test"
写为undefined
值。