【问题标题】:"Closure" in Javascript using object references: where are "private variables" stored?Javascript 中使用对象引用的“闭包”:“私有变量”存储在哪里?
【发布时间】:2018-12-20 10:22:19
【问题描述】:

免责声明:这可能是一个愚蠢的问题,但它让我在学习 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”中有一个(共享)引用。但这不是关闭(据我了解)。变量是否仍然存在,因为即使在函数返回后仍然存在对它的引用(不是垃圾收集)?我只是感到困惑,因为它的形式似乎接近结束,但也许我只是看到了一些纯粹巧合的相似之处。

【问题讨论】:

  • 我认为术语是,它存储在返回函数的LexicalEnvironment中。
  • 对象没有引用变量。它引用了您分配给属性的 (通过使用变量)。

标签: javascript closures


【解决方案1】:

在 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

【讨论】:

  • 不,但你可以通过闭包来强制“私有”变量,这是 OP 要求的。
  • @JayGould 我正在更新我的答案。谢谢
【解决方案2】:

在你拥有的函数内部:

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

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

此时函数结束。

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

变量_secretObject 超出范围。没有任何东西可以访问它。变量被清理。它不再存在。

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

如果你这样做,例如safebox = null,那么对第二个对象的引用就会消失。

这将留下对第二个对象的 0 个引用,因此它将被垃圾回收。

这会去掉referenceToSecretObject,所以会有0个对first对象的引用。

这个点,第一个对象将被垃圾回收。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2012-01-25
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多