RubyRogues播客上有人曾说过“学习CoffeeScript,因为CoffeeScript编写的javascript比你写得好。”抱歉,不记得是谁说的......
所以,我采用了一个非常简单的WORKING javascript函数:
的 togglingii.js 的
function pdtogglejs(id) { $('div .partybackground').removeClass("hidden"); }
这一行正在调用:
<a href="#" class="dctoggle" onclick="pdtogglejs('partybackground')">Read More...</a>
然后我把它转换成了这个咖啡因: 的 toggling.js.coffee
pdtogglecs(id) ->
jQuery('div .partybackground').removeClass("hidden")
并更改了html以引用pdtoggle * c * s而不是pdtoggle * j * s。
我可以在我的application.js文件中看到它们很好:
(function() {
pdtogglecs(id)(function() {
return jQuery('div .partybackground').removeClass("hidden");
});
}).call(this);
function pdtogglejs(id) { $('div .partybackground').removeClass("hidden"); }
;
(function() {
}).call(this);
但是,只有纯JavaScript才有用。 coffeescript始终返回未捕获的ReferenceError:未定义pdtogglecs。
基于其他stackoverflow问题,它必须是某种命名空间错误。可能是因为pdtogglecs本身就是一个函数内部的方式?但是,我尝试使用以下命令定义coffeescript函数:window.pdtogglecs,this.pdtogglecs,root.pdtogglecs和coffescript总是因为该错误而失败。
我错过了什么?
谢谢!
答案 0 :(得分:11)
你有两个问题,一个是CoffeeScript语法混淆,另一个是你知道的命名空间问题。
我们首先要整理你的语法混乱。这样:
f(x) -> ...
的解释如下:
f(x)(-> ...)
所以当得到这个:
pdtogglecs(id) ->
jQuery('div .partybackground').removeClass("hidden")
CoffeeScript认为您尝试将pdtogglecs
作为函数调用id
作为参数。然后它认为pdtogglecs(id)
返回一个函数,并且您希望以-> jQuery(...)
函数作为参数调用该函数。所以最终有点像这样:
callback = -> jQuery(...)
returned_function = pdtogglecs(id)
returned_function(callback)
这与你原来的JavaScript完全不同。你想创建一个名为pdtogglecs
的函数,它以id
为参数,然后运行你的jQuery东西:
pdtogglecs = (id) ->
# -----^ this is sort of important
jQuery('div .partybackground').removeClass("hidden")
通过查看生成的JavaScript,您可以看到正在发生的事情。
命名空间问题很简单,您可以根据您找到的其他问题找出答案。但是,为了完整起见,我会在这里照顾它。
CoffeeScript将每个.coffee
文件包装在一个自执行函数中,以避免污染全局命名空间:
(function() {
// JavaScript version of your CoffeeScript goes here...
})();
该包装器将所有内容限定为.coffee
文件。如果你想污染全局命名空间,那么你必须这样说:
window.pdtogglecs = (id) -> ...
你也可以说:
@pdtogglecs = (id) -> ...
但我更喜欢直接引用window
的明确性,这也可以避免在解析代码时担心@
(AKA this
)。