Jquery 为什么使用Coffeescript时此函数调用不起作用?
我现在正朝着使用Coffeescript编写所有javascript代码的方向过渡,但我很沮丧,因为最简单的例子给我带来了问题。到目前为止,我已经做了一个多小时的研究,却没有找到这个问题的答案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
<!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
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标签的唯一原因是用一个小例子来测试,我真的很高兴我这么做了,因为否则我就不会发现这种行为。这是一个很好的教训,我感谢你!你可以,索塔。它本来可以工作,但在这种情况下回调会立即运行。如果它以后再运行,它会工作得很好。