2

RubyRogues 播客上的某个人曾经说过“学习 CoffeeScript,因为 CoffeeScript 写的 JavaScript 比你好。 ”抱歉,不记得是谁说的了……

所以,我采用了一个非常简单的 WORKING javascript 函数:

切换ii.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 有效。咖啡脚本总是返回Uncaught ReferenceError: pdtogglecs is not defined。

基于其他stackoverflow问题,它一定是某种命名空间错误。可能是因为 pdtogglecs 本身在函数内部的方式?但是,我尝试使用以下方法定义咖啡脚本函数:window.pdtogglecs、this.pdtogglecs、root.pdtogglecs,而咖啡脚本总是因该错误而失败。

我错过了什么??

谢谢!!

4

1 回答 1

11

你有两个问题,一个是 CoffeeScript 语法混乱,另一个是你知道的命名空间问题。

我们将从整理您的语法混乱开始。这:

f(x) -> ...

是这样解释的:

f(x)(-> ...)

所以当给出这个时:

pdtogglecs(id) ->
   jQuery('div .partybackground').removeClass("hidden")

CoffeeScript 认为您正在尝试将pdtogglecsid作为参数调用。然后它认为pdtogglecs(id)返回一个函数,并且你想用你的-> jQuery(...)函数作为参数调用该函数。所以它最终是这样的:

callback = -> jQuery(...)
returned_function = pdtogglecs(id)
returned_function(callback)

这与您的原始 JavaScript 完全不同。您想创建一个名为的函数,该函数将pdtogglecsid作为参数,然后运行您的 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

于 2012-11-14T21:34:47.080 回答