Coffeescript 为什么可以';我不能调用这个函数吗?

Coffeescript 为什么可以';我不能调用这个函数吗?,coffeescript,Coffeescript,这太荒谬了 为什么我尝试这样做时会出错 #...codecodecode... g = generateGuid() #...codecodecode... generateGuid = -> "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace /[xy]/g, (c) -> r = Math.random() * 16 | 0 v = (if c is "x" then r else (r & 0x3 |

这太荒谬了

为什么我尝试这样做时会出错

#...codecodecode...

g = generateGuid()

#...codecodecode...

generateGuid = ->
  "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace /[xy]/g, (c) ->
    r = Math.random() * 16 | 0
    v = (if c is "x" then r else (r & 0x3 | 0x8))
    v.toString 16

我只想调用一个私有函数…

您试图在函数定义之前调用它:


如果您对此感到惊讶,请记住Coffeescript可以编译成Javascript——事实上,它只不过是一些Javascript的语法糖分。Javascript中应用的大多数规则在Coffeescript中也适用。

driis是正确的。进一步说明他的答案:您可能已经习惯了JavaScript的习惯用法

function generateGuid() { ... }
它允许您从其范围内的任何位置(甚至在其定义之前)调用
generateGuid
。CoffeeScript不会这样做;相反,它编译为

var generateGuid = function() { ... }
这样做有几个原因,但其长短不一的原因是函数遵循与所有其他变量相同的范围规则。在将值分配给
generateGuid
之前,
generateGuid()
尝试调用
undefined

注意,由于异步回调在JavaScript中的工作方式,这将起作用:

setTimeout (->
  g = generateGuid
  # ...codecodecode...
), 0

generateGuid = -> ...

请在帖子中包含错误消息/详细信息,并选择更合适的标题和所需行为的描述。除了在javascript中,在定义函数之前调用函数,因为函数的提升
setTimeout (->
  g = generateGuid
  # ...codecodecode...
), 0

generateGuid = -> ...