これを実現する方法は実際にはいくつかあります (1 つの方法は既にコメントに記載されています)。
クロージャ ラッパーなしでコンパイルする
これにより、すべての関数が外部スコープに公開されます。これは、ビルド プロセスを制御できる軽量フレームワークを使用している場合のオプションです。アセット パイプラインのコンテキスト内でできるかどうかはわかりませんが、小さなシナトラ アプリのコンテキストではうまく機能します。
coffee -b myfile.coffee
グローバル オブジェクトにアタッチする
ブラウザなどの特定のランタイムをターゲットにしていることがわかっている場合は、グローバル ウィンドウ オブジェクトを使用できます。
window.foo = -> alert("hello world")
これは、対象が Rails 環境であるため、コメントのソリューションと同じ効果です。しかし、@
which is sugar forを使用すると、現時点でthis.
のスコープが何であれ、それを添付します。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")