我现在正在转向使用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的ready处理程序中调用 sayHi()函数。但我得到的错误如下:
未捕获的TypeError:undefined不是函数
请帮助我,根据编译器和教程,我已经读过这个'应该'工作,但我不知道我在做什么可怕的错误为此不运行:(
答案 0 :(得分:11)
text/coffeescript
代码与text/javascript
代码存在重要差异。在文档加载之前,它们不会“运行”。这是因为咖啡脚本库必须找到所有咖啡脚本标签并进行编译,并且必须等到DOM准备就绪才能确保找到它们。
另一个问题是,如果事件已经发生,jQuery将立即触发DOM ready回调。在这种情况下它有。
所以当这个编译成JS时你会得到这个:
var sayHi;
$(function() {
return sayHi();
});
sayHi = function() {
return alert('Hi there!');
};
所以会发生什么:
sayHi
变量没有值,使其成为undefined
。sayHi()
。sayHi
将设置为您想要运行的功能。现在,如果这是一个普通的JS标记,它可能在文档加载之前运行,然后它就可以正常运行,因为回调实际运行的时间已经正确分配sayHi
。
要修复它,你应该在回调中运行pass之前分配函数。或者你可以完全跳过$(->)
,因为你已经知道DOM已经被解雇了。但实际上,这是你真的不应该使用coffeescript标签的一个主要原因。这与使用JS标签真的不一样。其中一个原因是,这不是在真实网站上使用CoffeeScript的推荐方法。
因此,在您的浏览器看起来像负责任的开发人员之前编译您的咖啡脚本:)
答案 1 :(得分:4)
翻转语句。看起来像CoffeeScript具有与旧C相同的限制,在您按照代码的顺序定义之前,您无法调用函数/方法。
所以使用
<script type="text/coffeescript">
sayHi = ->
alert 'Hi there!'
$ ->
sayHi()
</script>