是否可以使用表达式代替setTimeout函数中的回调函数?

时间:2018-04-13 20:50:57

标签: javascript settimeout

我最近被要求调试以下代码块并询问输出结果:

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);时,我们将不胜感激。

2 个答案:

答案 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)

什么也没做。