javascript中函数执行的优先级

javascript中函数执行的优先级,javascript,function,settimeout,order-of-execution,Javascript,Function,Settimeout,Order Of Execution,我不明白为什么第二个函数调用(在函数体之后)的优先级高于函数体内部的调用 function a(){ var num = 5; console.log( ++num ); setTimeout( a, 100 ); }; setTimeout(a,2000) 函数a没有调用,只是定义了。实际运行的代码段是a的定义,然后调用setTimeout(a,2000)。按时间顺序: 您正在定义函数a,而没有调用它 您正在计划在两秒钟后调用a:setTimeout(a,2000) 它被称为

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

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

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

按时间顺序:

  • 您正在定义函数
    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列表,内部时钟分辨率是多少,等等)

[*]我认为,只要使用一次
setInterval()
,就可以实现类似的行为

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

是一个函数体,在此之后我们调用。我不认为这是一个层次结构问题。

您期望什么行为?您是否应该编写“函数a(){…}();”(注意最后的括号)?您的代码没有在最后一行之前调用函数。我只是想知道为什么一个调用等待另一个调用?然后我就可以预测行为了。
num
似乎永远不会改变,这让你感到困惑吗?如果是这样的话,那是因为每次调用
a
时都要重新初始化一个新变量。我本来打算+1,但请省略
setInterval
部分。。。它在这里没什么可做的,而且可能会让旋转木马感到困惑。@MaxArt:移到一个较小的音符。我认为这并不令人困惑,但我同意这与剧本关系不大