2

我最近开始在我的 Rails 项目中大量使用咖啡脚本。

我很好奇你如何制作一个独立的功能。所以如果我这样做:

foo = ->
  alert("hello world")

编译为

(function() {
  var foo;

  foo = function() {
    return alert("hello world");
  };

}).call(this);

我如何使它编译为

var foo;
foo = function(){
  return alert("hello world");
}

我希望能够调用使用link_to_function "foo"

4

1 回答 1

1

实际上有几种方法可以实现这一点(评论中已经给出了一种方法)。

在没有闭包包装的情况下编译

这会将所有功能暴露给外部范围。如果您使用可以控制构建过程的轻量级框架,这可能是一个选项。我不确定您是否能够在资产管道的上下文中使用,但在小型 sinatra 应用程序的上下文中效果很好。

coffee -b myfile.coffee

附加到全局对象

如果您知道您的目标是特定的运行时,例如浏览器,您可以使用全局窗口对象。

window.foo = -> alert("hello world")

这与评论中的解决方案效果相同,因为目标是 Rails 环境。但是使用@which is sugar forthis.会将其附加到当前的任何范围this。假设函数没有在回调或具有绑定上下文的内部对象中定义,它可能是窗口对象。

@foo = -> alert("hello world")

更好的是创建自己的命名空间并以这种方式附加:

Mine ||= {}
Mine.foo = -> alert("hello world")
@Mine = Mine

CoffeeScript 类

或者使用 CoffeeScript 的类语法通过附加到原型本身来做同样的事情:

class @Mine
  @foo: -> alert("hello world") # called as Mine.foo() (notice the @ declaration)

在我们的 Rails 应用程序中,我们通常有一个定义命名空间的资产,也就是一个app/assets/javascripts名为 titled的文件mine.coffee

window.Mine ||= {}

然后在其他文件中,我们可以要求该命名空间:

#= require mine

class Mine.MyOtherThing
  @foo: -> alert("hello world")
于 2014-01-07T15:19:22.310 回答