Jquery 为什么使用Coffeescript时此函数调用不起作用?

Jquery 为什么使用Coffeescript时此函数调用不起作用?,jquery,coffeescript,Jquery,Coffeescript,我现在正朝着使用Coffeescript编写所有javascript代码的方向过渡,但我很沮丧,因为最简单的例子给我带来了问题。到目前为止,我已经做了一个多小时的研究,却没有找到这个问题的答案 <!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery-latest.js"></script> <script src="http://ja

我现在正朝着使用Coffeescript编写所有javascript代码的方向过渡,但我很沮丧,因为最简单的例子给我带来了问题。到目前为止,我已经做了一个多小时的研究,却没有找到这个问题的答案

<!DOCTYPE html>
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js" type="text/javascript" charset="utf-8"></script>
  <link href="sheet.css" rel="stylesheet" type="text/css" media="screen" />
  <script type="text/coffeescript">
    $ ->
      sayHi()

    sayHi = ->
      alert 'Hi there!'
  </script>
</head>    
<body>
  <div id="all">  
  </div>  
</body>
</html>

$ ->
()
早希=->
“你好!”
从上面的代码可以清楚地看出,我只是试图从jQuery的就绪处理程序内部调用sayHi()函数。但我得到的错误如下:

未捕获类型错误:未定义不是函数


请帮帮我,根据我读过的编译器和教程,这个“应该”是有效的,但我不知道我犯了什么错误,让它不能运行:(

text/coffeescript
标记与
text/javascript
标记有一个关键区别。它们不能“运行”这是因为coffee脚本库必须找到所有的coffee脚本标记并编译它们,并且必须等到DOM准备好之后才能确定找到它们

另一个问题是,如果事件已经发生,jQuery将立即启动DOM就绪回调

因此,当将其编译为JS时,您会得到:

var sayHi;
$(function() {
  return sayHi();
});
sayHi = function() {
  return alert('Hi there!');
};
因此发生的情况是:

  • 声明没有值的
    sayHi
    变量,使其
    未定义
  • 为使用此变量的jQuery创建DOM就绪回调
  • jQuery立即运行回调函数,因为DOM就绪已经发生
  • 回调函数执行,并尝试运行仍未定义的
    sayHi()
  • 回调运行后,
    sayHi
    将被设置为要运行的函数
现在,如果这是一个普通的JS标记,那么它可能在加载文档之前就已经运行了,然后它就可以正常工作了,因为当回调实际运行时,
sayHi
就会被正确分配

要解决此问题,您应该在回调中运行pass之前分配函数。或者您可以跳过执行
$(>)
完全是因为您知道DOM ready已经启动了。但实际上,这是您确实不应该使用coffeescript标记的一个主要原因。这与使用JS标记不一样。这也是在真正的网站上不推荐使用coffeescript的许多原因之一


因此,在浏览器将其视为负责任的开发人员之前,请编译您的咖啡脚本:)

翻转语句。看起来CoffeeScript与旧的C语言有着相同的局限性,在旧的C语言中,只有按照代码顺序定义函数/方法,才能调用它

所以使用

<script type="text/coffeescript">
  sayHi = ->
    alert 'Hi there!'

  $ ->
    sayHi()
</script>

早希=->
“你好!”
$ ->
()

上次我检查时,浏览器没有咖啡脚本解释器。。。或者是“coffeesript.js”脚本将CoffeeScript代码翻译成JavaScript?您是否尝试过翻转这两条语句?我从来没有使用过CoffeeScript,但我假设这是因为在定义方法/函数之前(比如在C中)调用了它,这意味着我做错了@巴巴克·纳法斯,快来!这使它起作用(翻转语句)。我首先声明了函数,然后在下面声明了ready处理程序。然而。。这引出了一个新问题。。为什么是这样?纯JS似乎没有强制执行此要求。@user766388。。。将CoffeeScript代码放在web-page.JavaScript的
元素中,是的。但很明显,浏览器无法执行coffee脚本标记。coffee脚本库在DOM ready上查找所有coffee脚本标记并编译它们,然后运行它们。因此,如果其中有一个
$(>)
,它将立即运行。因此,当浏览器遇到一个类型为浏览器没有解释器的
时,浏览器将忽略该脚本。我明白了。@squegy我完全同意你的看法。事情必须进行编译,实际上我不必太担心,因为我使用rails,资产管道在这方面做得很好。我使用coffee标签的唯一原因是用一个小例子来测试,我真的很高兴我这么做了,因为否则我就不会发现这种行为。这是一个很好的教训,我感谢你!你可以,索塔。它本来可以工作,但在这种情况下回调会立即运行。如果它以后再运行,它会工作得很好。