2

私は最近、Rails プロジェクトで coffeescript をかなり頻繁に使い始めました。

自立機能をどのように作るのか興味があります。だから私がするなら:

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

これを実現する方法は実際にはいくつかあります (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/javascriptstitledのファイルがありmine.coffeeます。

window.Mine ||= {}

次に、他のファイルでその名前空間を要求できます。

#= require mine

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