2017-05-18 7 views
1

ここに2つのjavascriptスニペットがあります。私は2つの間の違いを理解することはできません。両方とも新しいインスタンスを可能にするようです。2つのtest1とtest2のjavascriptスニペットの違いは何ですか?

var Test1 = (function() { 
      function Test1(_x, _y) { 
       this.x = _x; 
       this.y = _y; console.log("test1"); 
      } 
      return Test1; 
     }()); 
var Test2 = function() { 
      function Test2(_x, _y) { 
       this.x = _x; 
       this.y = _y; console.log("test2"); 
      } 
      return Test2; 
     }(); 

new Test1(1,2); 
new Test2(2,4); 

編集:それは私には同じように見えますが、TypeScriptを使用していたので、Type1のようなクラスが生成されました。彼らが一緒に行こうと決めた理由があるはずです。すべての最短コード後に良いですか?それは関数式の代わりに、関数の宣言であるように、発現コンテキストにfunctionステートメント部隊の周りに括弧を置く

おかげ

答えて

0

ありません。どちらの場合でも、自己呼び出し関数がありますが、ケース1の場合、すでにIIFEが存在するため実際に何もしない括弧で囲まれており、隠すことのできるスコープはもうありません。

差はちょうどこれら二つの間のようなものです:

生命維持の装飾について話す
var var1 = 1 + 3; 
var var2 = (1 + 3); 

、私は次の構文を使用することをお勧めします:

var Test2 = (function() { 
    function Test2(_x, _y) { 
     this.x = _x; 
     this.y = _y; console.log("test2"); 
    } 
    return Test2; 
})(); 

それはあまりにも同じことを行い、それ一般的に使用され普及している構文のようです。

TypeScriptがこのようなコードを生成しても、それが特別な目的で実行されたわけではありません。
おそらく、TypeScriptコンパイラがコンテキストスコープをどのように解釈し、この場合に必要かどうかにかかわらず、デフォルトでは、それを囲むことができます。

+0

"*以下の構文を使用することをお勧めします。デファクトスタンダード*" - どのように集めましたか? – Bergi

+0

@Bergiそれは私自身の経験です:)私はめったに他の用途を見ていません。私の言葉を* proof *でサポートするために、私は[SOでのIIFEについてのよくある質問]を見つけました(http://stackoverflow.com/questions/8228281/what-is-the-function-construct-in-javascript) 、回答の95%がこのアプローチを使用しています。私は自分の答えを編集し、これもあまりにも断定的な文章を使用しません。訂正ありがとうございました:) –

+0

本当に[純粋に意見に基づいて](http://stackoverflow.com/a/8774506/1048572)。 – Bergi

1

しかし、=の右側にfunction文を置くと、すでにこのように機能しているので、全く違いはありません。

関連する問題