我最近被要求调试以下代码块并询问输出结果:
setTimeout(function() {
console.log(1);
}, 20);
setTimeout(function() {
console.log(2);
}, 10);
setTimeout(function() {
console.log(3);
}, 0);
setTimeout(console.log(4), 30);
console.log(5);
根据我的理解,setTimeout()
只接受回调函数和延迟时间,所以setTimeout(console.log(4), 30);
会给出某种错误(因为这个setTimeout只接受一个表达式)并且不会记录任何内容控制台。但是在浏览器控制台中测试时,输出是
4
5
3
2
1
在解释为什么setTimeout(console.log(4), 30);
只打印出4并移至console.log(5);
时,我们将不胜感激。
答案 0 :(得分:2)
这样做是因为console.log(4)
只是一个立即执行的表达式(向控制台打印4)。
允许语法,因为如果返回值是一个函数,那么该函数将是计时器的回调,如下例所示:
function returnFunction(){
return function(){
console.log("hello");
};
}
// returnFunction will be executed immediately (because of the () after the
// function name) and it will return, yet another function. That returned
// function is the one that will be called after a one second delay.
setTimeout(returnFunction(), 1000);

可以通过传递代码来执行来设置计时器(而不是在回调函数中包含执行的代码),但是你必须将代码作为字符串传递:
setTimeout("console.log(4)", 2000);

但是,出于安全性和性能原因,强烈建议不要使用此语法。
详情请见setTimeout()
here 。
答案 1 :(得分:0)
每个函数参数都是一个表达式。因此
setTimeout(console.log(4), 10)
将执行记录4的console.log(4)
,然后评估为undefined
和
setTimeout(undefined, 10)
什么也没做。