-2

我不明白为什么第二个函数调用(在函数体之后)优先于函数体内部的调用?

function a(){
  var num = 5;
  console.log( ++num );
  setTimeout( a, 100 );
};
setTimeout(a,2000)
4

3 回答 3

6

按年代顺序:

  • 您正在定义函数a 而不调用它

  • 您计划a在两秒钟后被调用:setTimeout(a,2000)

  • 它被称为

  • 当它被调用时,它会安排自己在 100 毫秒后调用

您的代码基本上会休眠 2 秒,然后a以 100 毫秒的暂停[*]执行。

但是,根据您的上下文判断,您在问以下情况下的优先级是什么:

setTimeout(a, 2000);
setTimeout(b, 100);

好吧,很可能b会首先被调用(假设第一行和第二行之间没有不可预测的暂停,例如由于整体操作系统性能问题)。

如果您使用相同的超时:

setTimeout(a, 100);
setTimeout(b, 100);

a很可能会首先被调用。但是我不认为这是有保证的,并且取决于 JS 引擎(它是否对即将发生的事件使用严格的 FIFO 列表,内部时钟分辨率是多少等)

[*] 你可以通过使用once来实现类似的行为。setInterval()

于 2012-06-07T12:56:45.987 回答
1

该函数a没有被调用,只是被定义。实际运行的代码是 的定义a,然后setTimeout(a,2000)被调用。

于 2012-06-07T12:55:15.730 回答
0

我认为

function a () {
    var num = 5;
    console.log( ++num );
    setTimeout( a, 100 ); 
};

是一个函数体,在此之后我们调用。我不认为这是一个等级问题。

于 2012-08-03T09:42:56.717 回答