javascript设置超时混乱

javascript设置超时混乱,javascript,coffeescript,Javascript,Coffeescript,我不熟悉javascript/coffeescript 有人能解释一下为什么这个coffeescript/javascript可以毫不延迟地快速通过吗? 我对第一种情况的想法是,它调用updateMap(10),将在10秒后“安排”调用updateMap(9),这将安排调用updateMap(8),以此类推。这两个例子似乎基本相同。我错过了什么 coffeescript: updateMap = (numUpdates) -> console.log("updatin

我不熟悉javascript/coffeescript

有人能解释一下为什么这个coffeescript/javascript可以毫不延迟地快速通过吗? 我对第一种情况的想法是,它调用
updateMap(10)
,将在10秒后“安排”调用
updateMap(9)
,这将安排调用
updateMap(8)
,以此类推。这两个例子似乎基本相同。我错过了什么

coffeescript:

    updateMap = (numUpdates) ->
      console.log("updating, numUpdates = #{numUpdates}")
      if numUpdates > 0 
        $.getScript('/map_markers.js')
        setTimeout(updateMap(numUpdates - 1) , 10000)

javascript:

      updateMap = function(numUpdates) {
        console.log("updating, numUpdates = " + numUpdates);
        if (numUpdates > 0) {
          $.getScript('/map_markers.js');
          return setTimeout(updateMap(numUpdates - 1), 10000);
        }
      };
但是这一组可以工作(具有所需的延迟)

咖啡脚本:
更新映射=(numUpdates)->
计数=0
updateMapCallback=->
计数+=1
控制台日志(“更新”)
$.getScript('/map\u markers.js')
setTimeout updateMapCallback,10000,除非计数
当你写:

updateMap = function(numUpdates) {
        ...
                return setTimeout(updateMap(numUpdates - 1), 10000);
      };
您正在调用updateMap并将返回值传递给setTimeout,以便稍后调用。由于函数一直在调用自身,因此它将以尽可能快的速度(或者如果开始时numUpdates小于零,则永远)顺序调用自身,直到
numUpdates-1
为零(即numUpdates次)


大约10秒钟后,setTimeout将尝试调用返回值(这是一个数字)并抛出一个错误numUpdates times(如果它没有达到其他限制并同时停止)。

因为
setTimeout
需要一个函数,但
updateMap
不返回函数
setTimeout
也接受一个参数列表。@我明白了,第二个示例确实返回了一个函数,我想我仍然很困惑。第一个示例确实返回“setTimeout(updateMap(numUpdates-1),10000)”,它返回函数执行的结果,该结果不是函数。第一个示例的等价项是
returnsettimeout(function(){updateMap(numUpdates-1)},10000)。你也不需要在那一点上返回
。多亏了大家,我现在得到了它。我还发现,正如elclanrs所指出的,setTimeout确实需要一个参数列表。因此,将第一个示例更改为setTimeout(updateMap,10000,[numUpdates-1])使该示例也可以工作。
updateMap = function(numUpdates) {
        ...
                return setTimeout(updateMap(numUpdates - 1), 10000);
      };