Почему я не могу вызвать эту функцию? - PullRequest
2 голосов
/ 31 декабря 2011

Это становится нелепым ...

Почему я получаю ошибку, когда пытаюсь это сделать?

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

5 голосов
/ 31 декабря 2011

Дрис правильный.Чтобы расширить его ответ: Вы можете использовать JavaScript-идиому

function generateGuid() { ... }

, которая позволяет вам вызывать generateGuid из любой точки его области действия (даже до ее определения).CoffeeScript не делает этого;вместо этого он компилируется в

var generateGuid = function() { ... }

Для этого есть несколько причин, но суть в том, что функции подчиняются тем же правилам области видимости, что и все другие переменные.Перед присвоением значения generateGuid, generateGuid() является попыткой вызова undefined.

Обратите внимание, что из-за того, как асинхронные обратные вызовы работают в JavaScript, это будет работать:

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

generateGuid = -> ...
3 голосов
/ 31 декабря 2011

Вы пытаетесь вызвать функцию до ее определения. Это работает :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...