为什么我不能调用这个函数?

时间:2011-12-30 22:44:48

标签: 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 | 0x8))
    v.toString 16

我想做的就是打电话给私人电话......

2 个答案:

答案 0 :(得分:5)

driis是正确的。扩展他的答案:你可能习惯了JavaScript习语

function generateGuid() { ... }

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

var generateGuid = function() { ... }

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

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

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

generateGuid = -> ...

答案 1 :(得分:3)

您正在尝试在定义之前调用该函数。 This works

#...codecodecode...

#...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

g = generateGuid()

如果你对此感到惊讶,请记住Coffeescript编译为Javascript - 实际上,它只比一些Javascript的语法糖更多。在Javascript中适用的大多数规则也适用于Coffeescript。