1

私が読んでいるjavascriptデザインパターンに混乱しています:

var class = (function() {

  ...a bunch of code...

  return {

  .. some more code..

  ;

  // or, in some cases

  return function(constructorArgs) {

  };

})();

私の質問は:returnステートメントは何をしているのですか?なんでそこにあるの?誰もそれについて言及したり話したりしたくないので、私は混乱しています。

4

4 に答える 4

3

あなたが言及している2つの異なるパターンがあると思います。

匿名の閉鎖

1つ目は、クロージャを作成するために無名関数を使用してコードのブロックをラップすることです。

var outer = (function() {
  var inner = "now you see me!";

  return inner + " now you don't"
})()

匿名関数は、定義されvarた変数の新しいスコープを作成します。実際、これにより、その特定の関数内でのみ表示される変数を定義できます。

inner上記の例では、関数内にアクセスできますが、関数外では定義されていません。

"クラス"

2つ目は、JavaScriptで「クラス」を定義するための一般的なパターンです。

var MyClass = (function() {
  function MyClass(arg) {
    this.arg = arg
  }

  return MyClass
})()

クロージャ内でコンストラクター関数を定義することにより、クラスが適切に含まれていることを確認できます。また、グローバル名前空間を汚染したり、クラスコンストラクターのプロトタイプのプロパティとして配置したりすることなく、クラス全体の状態またはプライベートヘルパーメソッドを共有できます。

于 2013-01-20T22:35:23.063 に答える
2

記号の右側のコード=は次の形式です(function(){})()。; これが行うことは、関数をコンパイルすることです-事実上、以下と同じです:

function temp() {
}

class = temp();

ただし、例の関数内には、返される別の関数があります。これが意味するのは、これclassが関数でもあるということです。vtortolaによって参照されるクロージャ効果により、関数は関数でclass宣言されているすべての変数などを参照できます。temp

これの考え方は、内部関数が「グローバル」(またはセミグローバル)スコープでぶらぶらしたくない状態を参照できるようにすることです。classメソッドがどこで呼び出されるかは関係ありません。誰が、それは常にそのデータにアクセスできます。

編集:コードから、この場合のパターンの目的は「クラス」タイプの関数を作成することであるように見えます。したがって、次のコードでそれを呼び出すことができます。

var myInstance = new class();

class予約語であると合理的に確信しているので、どのコードも機能しないと感じていますが...

于 2013-01-20T22:32:12.990 に答える
2

これはクロージャと呼ばれます。

var myVar = (function (param1, param2){
    //do things
}('myParam1','myParam2')):

javascriptエンジンは、括弧の間にあるものをすぐに実行します。

そして、の値はmyVar関数function (param1, param2){ ... }が返すものになります。

この関数は('myParam1','myParam2')引数として使用します。

クロージャーは2つの異なる方法で書くことができます:

(function (receivedArgs){
  //do things
})(yourArguments);

また

(function (receivedArgs){
   //do things
}(yourArguments));
于 2013-01-20T22:36:28.020 に答える
1

閉鎖です。関数は、途中でいくつかの変数を囲む内部関数を返しています。

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

乾杯。

于 2013-01-20T22:28:28.300 に答える