2

だから私はコーヒースクリプトにかなり慣れていないので、新しい仕事のためにかなり早くそれを学ばなければなりません. 次のコードの違いは何ですか:

class Person

class @Person

次を使用する場合

bob = new Person() 

結果はどのように異なりますか?

4

2 に答える 2

0

class Cが生成する完全な JavaScriptを見ればclass @C、物事はより明確になるはずです。class Cになります(いくつかのクリーンアップを含む):

(function() {
  var C = (function() {
    function C() {}
    return C;
  })();
}).call(this);

したがって、C「クラス」は実際には、自己呼び出し関数 (SIF) ラッパー内のローカル変数です。このラッパーは、CoffeeScript がスコープを処理する方法の一部です。

このドキュメントではわかりやすくするために省略していますが、CoffeeScript のすべての出力は無名関数でラップされています。 (function(){ ... })();このセーフティ ラッパーは、キーワードの自動生成と組み合わせるvarことで、グローバル名前空間を誤って汚染することを非常に困難にします。

を見るとclass @C、ほぼ同じことがわかります。

(function() {
  this.C = (function() {
    function C() {}
    return C;
  })();
}).call(this);

違いは、var C(ローカル変数) とthis.C(何であれプロパティthis) です。

thisでは、SIF の中には何が入っているのでしょうか? this内側は外側にあるものになります:

(function() { ... }).call(this)
// -----------------------^^^^

callSIF を呼び出すために使用されるためです。thisSIF の外には何がありますか? ブラウザーでは、windowclass @C同等でclass window.Cあり、のプロパティwindowはグローバルに表示されます。したがって、ブラウザ環境でグローバルに表示されますが、単純なclass @Cものは、それが定義されているファイルでのみ表示されます。Cclass C

より一般的なアプローチ (少なくとも私が使用したコードでは) は、グローバルに表示されるアプリケーション固有の名前空間を持つことです。

// Somewhere before anything else happens...
window.whatever_the_app_is_called = { };

次に、その名前空間のどこかにクラスを配置します。

class whatever_the_app_is_called.C
    #...

Require.js または node.js を使用している場合は、使用する独自の名前空間パターンがあります。

于 2013-11-12T21:36:53.613 に答える
0

@thisそうです...class @Personにコンパイルされますthis.Person =

コンパイルされた JS がどのように見えるかは、coffeescript.org/#tryで確認できます。

于 2013-11-12T15:19:01.023 に答える