实际上有几种方法可以实现这一点(评论中已经给出了一种方法)。
在没有闭包包装的情况下编译
这会将所有功能暴露给外部范围。如果您使用可以控制构建过程的轻量级框架,这可能是一个选项。我不确定您是否能够在资产管道的上下文中使用,但在小型 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")