5

サンプル コードでこの型関数を見つけましたが、広く使用されているようです。しかし、これをどのように呼ぶか、または実際には、それがどのパターンを表しているのかわかりません。

 l = function (a1){
  someVar = {
    someFn: function(a2){
       console.log(a1);
       console.log(a2);
    }
  }
}

someFn を実行するにはどうすればよいですか? これは閉鎖と関係がありますか?

アップデート:

これがコードの使用方法です。@joseph-the-dreamer が推測したように、モジュールの一部として使用されています。

  App.module("Module", function(a1) {
      someVar = {
        someFn: function(a2){
           console.log(a1);
           console.log(a2);
        }
      }
  })
4

3 に答える 3

7

現在の状態から、l最初に呼び出しsomeVarて access に設定する必要がありますsomeFn。そうしないと、まったくアクセスできませんsomeFn

しかし、 の変数宣言がなければsomeVar、呼び出しによって暗黙lのグローバルが作成されます。暗黙のグローバルは良い習慣ではありません。グローバルであることを意味していても、どこかで宣言する必要があります。 someVarsomeVar

var someVar;

l = function (a1){
  someVar = {
    someFn: function(a2){
       console.log(a1);
       console.log(a2);
    }
  }
}

l(1);
someVar.someFn(2);

//1
//2

呼び出しからアクセスに戻るsomeVarlこともできますsomeVar。今回someVarは、 のローカル変数であることに注意してくださいl

var l = function (a1){
  var someVar = {
    someFn: function(a2){
      console.log(a1);
      console.log(a2);
    }
  }
  return someVar;
}

l(1).someFn(2);

pattern に関しては、あなたが持っているのはモジュール patternの不完全な形だと思います。通常、モジュール パターンはIIFEでラップし、モジュールへのインターフェイスとしてオブジェクトを返します。

于 2013-06-09T04:40:48.977 に答える
1

someVarが の外部のスコープ内の変数でない場合、は のプライベート メンバー関数であるため、 を呼び出すl()ことはできませんsomeFn()someFn()someVar

それ以外の場合、 にアクセスできる場合は、次のようsomeVarに呼び出すことができます。この場合、 willは最後に呼び出されてから割り当てられているため、奇妙な動作をすることに注意してください。someFn()someVar.someFn()console.log(a1)a1l()

于 2013-06-09T04:41:35.203 に答える
0

JavaScript には、 globallocalの 2 種類の変数があります。

//local
var foo = "foo";

//global
bar = "bar";

あなたのサンプルで見たものからl、匿名関数を格納するために使用されるグローバル変数があります。この関数内には、無名関数を格納するsomeVarという名前のローカル変数を持つオブジェクトを格納するという名前のグローバル変数があります。someFn

を実行するsomeFnには、次の手順を実行する必要があります。

l("Foo");               //This does not output anything
someVar.someFn("Bar");  //This will output "Foo" and then "Bar"

を呼び出すとl("Foo");、グローバル変数が作成されますsomeVar。これは、 にsomeVar格納されている無名関数のスコープ外であっても、どこでも使用できることを意味しますl。引数にクロージャーを使用していますa1

グローバル変数はどこでも使用できますが、グローバル スコープを汚染するため、使用を制限することをお勧めします。つまり、エラーが発生しやすくなります。

グローバル変数を使用しないアプローチの方が優れています。ここでの小さな例:

"use strict";

var l = function(a1) { //constructor
  var _a1 = a1; //private variable
  this.someFn = function(a2) { //public method
     console.log(_a1);
     console.log(a2);
  };
};

var object1 = new l("Foo");
var object2 = new l("Foo");
object1.someFn(1); //outputs "Foo" and then 1
object2.someFn(2); //outputs "Foo" and then 2
于 2013-06-09T05:05:00.307 に答える