Javascript中使用对象引用的“关闭”:“私有变量”存储在哪里?

时间:2018-07-12 08:59:53

标签: javascript closures

免责声明:这可能是一个愚蠢的问题,但这使我在学习Javascript时感到困惑。

我最近遇到了使用范式在Javascript中使用闭包创建私有变量的方法,即使用一个函数返回通过其方法引用“私有变量”的对象

var safebox = function() {
  var _privateVariable = "abcd";
    return {
    "accessFunction":function() {
    return _privateVariable;
    }
}();
safebox.accessFunction(); // "abcd"

这就是说,即使在封闭函数返回之后,封闭机制仍保留变量_privateVariable

如果私有变量是封闭函数返回后对其保留引用的对象,会发生什么情况?

var safebox = function () {
  var _secretObject = {"secret": "abcd"}
  return {referenceToSecretObject: _secretObject};

}();


console.log(safebox); // "abcd"
safebox.referenceToSecretObject.secret = "def";
console.log(safebox); // "def"

据我所知,此处仍然存在“ _secretObject”,因为在“ safebox.referenceToSecretObject”中有一个(共享的)引用。但这不是闭包(据我了解)。只是因为变量即使在函数返回后仍然存在,因为仍然有对它的引用(不是垃圾回收),所以变量仍然存在吗?我只是感到困惑,因为它在形式上似乎接近闭包,但也许我只是看到一些纯属巧合的相似之处。

2 个答案:

答案 0 :(得分:1)

在您拥有的功能内:

  • 变量_secretObject的值是对对象的引用
  • 具有属性referenceToSecretObject的第二个对象,该对象具有对同一对象的引用

您正在调用该函数,并将返回值(第二个对象)分配给safebox

功能到此结束。

  

如果私有变量是封闭函数返回后对其保留引用的对象,会发生什么?

变量_secretObject超出范围。没有什么可以访问它。变量被清除。它不再存在。

用于引用的对象_secretObject仍然存在,因为第二个对象仍引用它(第二个对象由safebox引用)。

例如,如果要使用safebox = null,则对第二个对象的引用将消失。

这将对第二个对象保留0个引用,因此将对其进行垃圾回收。

这将摆脱referenceToSecretObject,因此对 first 对象的引用将为0。

此时,第一个对象将被垃圾回收。

答案 1 :(得分:-2)

在Javascript中,没有像PHP中的private variablesprivate functions这样的东西。下划线符号只是一个约定。

您可以使用闭包来获得“像私有变量”。例如:

function Foo(bar)
{
  //bar is inside a closure now, only these functions can access it
  this.setBar = function() {bar = 5;}
  this.getBar = function() {return bar;}
  //Other functions
}

var myFoo = new Foo(5);
console.log(myFoo.bar);      //Undefined, cannot access variable closure
console.log(myFoo.getBar()); //Works, returns 5