1

Javascript を学習していますが、このコードが機能する理由がわかりません。

function getObj()
{
   var objAddress = 
   {
      address: "Client Address",
      getAddress: function() {
         return this.address;
      },
      setAddress: function(newAddress)
      {
         this.address = newAddress;
      }
   };

   var objClient =
   {
      name: "Client name",
      getAddress: function()
      {
         return objAddress.getAddress();
      },
      setAddress: function(newAddress) {
         objAddress.setAddress(newAddress);
      }
   };

   return objClient;
}

gObj = getObj();
console.log(gObj.getAddress()); // Will print "Client Address"
gObj.setAddress("xpto");
console.log(gObj.getAddress()); // Will print "xpto"

getAddress()関数を抜けた後に存在しないはずのオブジェクトの別のメソッドを呼び出すので、うまくいかないだろうと思っていました。しかし、これは機能しているobjAddressので、関数を終了した後でもオブジェクトがまだ存在していると思いgetObjます。

関数の外では、どのように機能しますgObj.getAddress()か?

4

3 に答える 3

3

ローカル変数を使用する関数を作成すると、関数はこのローカル変数を「記憶」します。必要なすべてのローカル変数は、クロージャーと呼ばれる特別なオブジェクトに格納されます。直接アクセスすることはできませんが、関数はアクセスできます。javascript デバッグの Chrome デベロッパー ツールは、クロージャー オブジェクトを示しています。Chrome デベロッパー ツールの閉鎖

于 2013-11-04T15:24:38.487 に答える
1

これはクロージャーと呼ばれます。MDN ページから:

クロージャーの親関数からの変数は、親のスコープからバインドされたままになります。(リンク)

つまり、関数は定義されたスコープへの参照とともに存在します。スコープへの参照を持つ関数が存在する限り、スコープは存在します。

于 2013-11-04T15:23:08.313 に答える
0

getObjクロージャーであり、ここにあります:

gObj = getObj();

gObj はそのクロージャーのインスタンスであるため、そのクラスで定義されているすべての関数とプロパティは oObj でも有効です。

于 2013-11-04T15:23:51.317 に答える