1

レール 3.2.8。私の JS 関数のいくつかを CoffeeScript に変換する際に、関数を次のように宣言するといういくつかの質問に遭遇しました。

@foo = (bar) ->

fooグローバル名前空間に入れます。.js.erbしかし、私の関数はアプリケーションの他の場所、特にファイルにあるものを呼び出すため、そうではありません。

機能するものは次のとおりです。

foo = (bar) ->

window.foo = foo

これで、ファイル内のすべての呼び出しが正常に機能し.js.erbます。

@foo =表記が期待どおりに機能しない理由は何ですか? これは、関数をグローバル名前空間に公開するために余分な行を追加することを覚えておく必要があるよりもはるかに簡単です。

4

2 に答える 2

4

@fooに変換しますthis.foo

fooに変換しますvar foo

それらの2つの間には大きな違いがあります。


例えば:

bar = (baz) -> 
 @bar = 5
 lemon = @bar + baz

 @foo = (bar) ->
  lemon
 return @

Bar = new bar(12)

翻訳先:

var Bar, bar;

bar = function(baz) {
  var lemon;
  this.bar = 5;
  lemon = this.bar + baz;
  this.foo = function(bar) {
    return lemon;
  };
  return this;
};

Bar = new bar(12);

生成されたコードのフィドル デモを参照してください: http://jsfiddle.net/maniator/rXWw2/

これはCoffeeScriptとそれが生成したコードを示すリンクです

于 2012-11-14T15:05:49.960 に答える
0

最初の @foo = () -> "abc" がグローバル ウィンドウ オブジェクトに追加されない理由を理解するために重要と思われるものを追加したかっただけです。

Coffeescript ラップ - コンパイルされると、すべての .coffee ファイルのすべてのコンテンツが周囲の無名関数にラップされ、すぐに実行されます。したがって、明示的にその理由から、グローバル名前空間は汚染されていないため、開発者が「邪悪な」グローバルを作成することから暗黙的に保護されます。

したがって、foo は無名ラッパー関数のメンバー関数になります

とにかく、あなたが望むのは、定義を追加するだけのグローバル構成オブジェクトか何かだと思います---すぐにすばやく簡単にアクセスするためだけに、実際にグローバルを作成するつもりはありませんでしたね?? :)

于 2012-11-15T02:12:57.090 に答える