4

引数によって提供されるデータはどこに格納されますか? 存在はvar first暗黙のうちに作成されますか?

function Student(first){
   this.getFirst = function(){
     return first;
   }
}

テスト済み:

var myStudent = new Student("ross");

console.log(myStudent);// 生徒 { getFirst=function() }

console.log(myStudent.getFirst());//ロス

console.log(first);// 参照エラー、最初は定義されていません

console.log(myStudent.first);// 未定義

for(var x in myStudent){ console.log(x); }// getFirst

私の2番目の質問は、これらを正しく理解しているかどうかです:

JavaScriptコンストラクタ内の「var」変数はどうなりますか?

「var」変数、「this」変数、「global」変数 - JavaScript コンストラクター内

...getFirst関数はクロージャーを作成し、コンストラクターのパラメーター値の状態を保存しますがvar first、コンストラクター本体で a を使用する場合、それを「カプセル化」と考えても問題ありませんか? さらに、内部関数はすべてのパラメータ値を「閉鎖状態」に保存するか、内部関数によって参照されるものだけを保存しますか?

ご感想ありがとうございます。これはSOに関する私の最初の質問ですが、ほぼ毎日サイトを参照として使用しているので、ありがとうございます. 私のプログラミング知識は限られているため、くだらない用語を使用した場合はご容赦ください。必要な箇所を明確にしていただければ幸いです。

4

2 に答える 2

4

firstパラメーターは、コンストラクターである関数にローカルに格納されるため、その内部のどこでもスコープ内にStudent()なります。

さらに興味深いことに、割り当てている匿名の内部関数はthis.getFirstその値を閉じています。firstそのため、コンストラクターの実行が終了した後でも、内部関数は変数への参照を維持します。

これは、コンストラクターだけでなく、通常の関数でも機能します。

function makeCounter() {
   var count = 1;
   return function() { return count++; };
}

var counter = makeCounter();
console.log(counter());  // 1
console.log(counter());  // 2
console.log(counter());  // 3

適切な方法で使用すると、クロージャでキャプチャされた値に外部からアクセスできないという意味で、このアプローチを使用して JavaScript で「プライベート」変数を実現できます。

そのため、クロージャーがスコープ内のすべての変数をキャプチャするか、使用する変数のみをキャプチャするかは問題ではないことがわかります。これらのクローズド オーバー変数に「内部に到達する」ことはできないからです。(ただし、実際には通常、使用された値のみがキャプチャされるため、ランタイムは不要な残りの値をガベージ コレクションできます。)

于 2012-10-31T02:37:09.303 に答える
1

あなたが求めていることをもう少し詳しく説明すると、 を作成することvarではなく、インスタンスでは関数もarguments配列を保持します。

あなたの関数は、両方のクロージャーを問題なく作成できます。関数から関数を返すことにより、返された関数 (またはメソッドとして関数を持つオブジェクト) は、それらの関数を上書きしない限り、
すべてのvarsandにアクセスできます。arguments

閉鎖の魔法。

于 2012-10-31T03:33:36.563 に答える