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 回答