0

ここにはすでに名前空間に関する多くのスレッドがあることを知っています。そして、私もそれらの多くを読みました。まだ少し確信が持てませんが、名前空間とクロージャーについて少し混乱しています。また、スレッドに特定のコードをいくつか持ってきます。

以下は名前空間です。

 var Interface = (function(){
     return {
         name: value,
         name: function( ... ) {
         }
     }; })();


//interface.call(); >> to call the namespace (I did not get where yet, but this is another story I think)

また:

var Interface = (function(){
     function a(){
     }
     return {
         name: a
     }; })();

わかりました、多くのスレッドとサイトを読んで、最初に気づいたことは: - Javascript には名前空間がなく、何らかの理由でスキップされました。- クロージャーはほとんど同じようです。少なくとも、違いを理解するための知識が不足しています。たとえば、クロージャーであるはずの関数は次のとおりです。

var Counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }   
})();

質問:

1)名前空間とクロージャーは同じですか?おそらく「定義」のレベルが異なるだけです:クロージャー(「メソッド」)は、名前空間(概念)がJavascriptでどのように実現されるのですか?

2) 上記の名前空間: 次の方法でアクセスfunction aしますか?

Interface.name()

3) この名前空間は、パラメーターを持つ関数を使用してどのように機能しますか?

 var Interface = (function(){
     function a(p1, p2){
     }
     return {
         name: a
     }; })();

これをどのように呼ぶことができますか?( と を挿入p1したことに注意してくださいp2)。

4)名前空間は(1つの!)名前空間ですか、それとも名前空間を含めることができる名前空間でもあるのですか(フォルダーにフォルダーを含めることができるように)?

4

3 に答える 3

0

名前空間とクロージャは同じですか

いいえ。名前空間は、「行うことすべてを単一のグローバル変数に割り当てられたオブジェクトのプロパティとして配置する」というあいまいに定義された用語です。

クロージャーは、特定の関数 (または関数のセット) のみがアクセスできるように、いくつかの変数をラップする手段です。

上記の名前空間では、次の方法で「関数 a」にアクセスしますか。

Interface.name()

はい

この名前空間は、パラメーターを持つ関数を使用してどのように機能しますか?

他の関数と同じです。引数を渡したい場合は、呼び出すときに と(の間に入れます。)

名前空間は(1つの!)名前空間ですか、それとも名前空間を含むことができる名前空間でもあるのですか(フォルダーがフォルダーを持つことができるように)?

オブジェクトは、他のオブジェクトを指すプロパティを持つことができます。これらのオブジェクトは同じことができます。など、好きなだけ深く。どのオブジェクトにも、プロパティ値として関数を指定できます。

于 2013-12-17T14:43:53.783 に答える
0

こんにちは

まず第一に、答えてくれてありがとう。しかし、実際に読んでみると、「名前空間とクロージャーは同じですか」という質問に対する答えは正反対です。

最初 の回答: ほぼその通りです。「名前空間」は JavaScript に存在する概念ではないため、オブジェクトでエミュレートします。クロージャー (オブジェクトを返す) は、そのようなオブジェクトを作成する 1 つの方法にすぎません。

2番目: いいえ。名前空間は、「単一のグローバル変数に割り当てられたオブジェクトのプロパティとして行うすべてのものを置く」というあいまいに定義された用語です。クロージャーは、特定の関数 (または関数のセット) のみがアクセスできるように、いくつかの変数をラップする手段です。

結論: 名前空間は Javascript には存在しませんが、JavaScript にも存在することを定義しましょう。これを前提として、名前空間を実現するためにクロージャー (変数をラップして、特定の関数からアクセスできるようにする) を使用できます。名前空間は「特定の関数」になります。

上記の例(および変数)があると仮定して、今それが正しいことを理解しましたか?

var Interface = (function(){
    var someVar = "";
    function name(p1, p2) {
    }
    return {
        name: name,
       value: function() {
               return someVar;
     }
    }; 
})();
  • これは「someVar」と「name」をラップするクロージャです。
  • クロージャーは変数「Interface」に割り当てられます。
  • 「インターフェース」は名前空間です。「Interface.call()」と記述することで「アクティブ化」できます。

正しい、間違っている、他の意味は?

ありがとう、メル

于 2013-12-18T13:57:27.397 に答える
0

1)名前空間とクロージャーは同じですか?おそらく「定義」のレベルが異なるだけです:クロージャー(「メソッド」)は、名前空間(概念)がJavascriptでどのように実現されるのですか?

それだけです。「名前空間」は JavaScript に存在する概念ではないため、オブジェクトでエミュレートします。クロージャー (オブジェクトを返す) は、そのようなオブジェクトを作成する 1 つの方法にすぎません。

2)上記の名前空間で:次の方法で「関数a」にアクセスしますか:Interface.name()

はい、オブジェクトnameのプロパティであり、値として機能が割り当てられているためです。Interfacea

3) この名前空間は、パラメーターを持つ関数を使用してどのように機能しますか?

このような:

var Interface = (function(){
    return {
        name: function(p1, p2) {
        }
    }; 
})();

またはこれ:

var Interface = (function(){
    function name(p1, p2) {
    }
    return {
        name: name
    }; 
})();

これをどのように呼ぶことができますか?(p1 と p2 を挿入したことに注意してください)。

このような:

Interface.name(123, 'abc');

4)名前空間は(1つの!)名前空間ですか、それとも名前空間を含めることができる名前空間でもあるのですか(フォルダーにフォルダーを含めることができるように)?

「名前空間」は JavaScript の単なる抽象的な概念であり、通常はオブジェクトとして実装されるため、別のネストされた「名前空間」を持つことができ、そのプロパティの 1 つとして別のオブジェクトを持ち、それを名前空間と呼びます。

于 2013-12-17T14:50:51.903 に答える