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

Javascript中使用对象引用的“闭包”:私有变量存储在哪里?,javascript,closures,Javascript,Closures,免责声明:这可能是一个愚蠢的问题,但它让我在学习Javascript时感到困惑 我最近在Javascript中使用闭包创建私有变量的范例方法,即使用一个函数返回一个通过其方法引用私有变量的对象 var safebox = function() { var _privateVariable = "abcd"; return { "accessFunction":function() { return _privateVariable; } }(); safebo

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

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

var safebox = function() {
  var _privateVariable = "abcd";
    return {
    "accessFunction":function() {
    return _privateVariable;
    }
}();
safebox.accessFunction(); // "abcd"
也就是说,闭包机制即使在封闭函数返回后也会维护变量_privatevaluate

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

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

}();


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

在这里,据我所知,''u secretObject'仍然存在,因为我们在'safebox.referenceToSecretObject'中有一个对它的共享引用。但据我所知,这并不是结束。变量之所以仍然存在,是因为即使在函数返回后,对它的引用也没有被垃圾收集吗?我只是感到困惑,因为它在形式上似乎接近尾声,但也许我只是看到一些纯粹巧合的相似之处

在Javascript中没有像PHP中那样的私有变量或私有函数。下划线符号只是一种约定

您可以使用闭包来创建一个类似私有的变量。例如:

函数Foobar { //bar现在位于闭包中,只有这些函数才能访问它 this.setBar=函数{bar=5;} this.getBar=函数{return bar;} //其他职能 } var myFoo=新Foo5; console.logmyFoo.bar//未定义,无法访问变量闭包
console.logmyFoo.getBar//在Javascript中没有像PHP中那样的私有变量或私有函数。下划线符号只是一种约定

您可以使用闭包来创建一个类似私有的变量。例如:

函数Foobar { //bar现在位于闭包中,只有这些函数才能访问它 this.setBar=函数{bar=5;} this.getBar=函数{return bar;} //其他职能 } var myFoo=新Foo5; console.logmyFoo.bar//未定义,无法访问变量闭包
console.logmyFoo.getBar//工作,在函数中返回5:

变量_secretObject,其值是对对象的引用 具有属性referenceToSecretObject的第二个对象,该对象具有对同一对象的引用 您正在调用该函数并将第二个对象的返回值分配给safebox

此时,函数结束

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

变量_secretObject退出范围。没有任何东西可以访问它。变量已清除。它已经不存在了

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

例如,如果您当时选择safebox=null,那么对第二个对象的引用就会消失

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

这将删除referenceToSecretObject,因此对第一个对象的引用将为0


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

在您拥有的函数中:

变量_secretObject,其值是对对象的引用 具有属性referenceToSecretObject的第二个对象,该对象具有对同一对象的引用 您正在调用该函数并将第二个对象的返回值分配给safebox

此时,函数结束

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

变量_secretObject退出范围。没有任何东西可以访问它。变量已清除。它已经不存在了

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

例如,如果您当时选择safebox=null,那么对第二个对象的引用就会消失

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

这将删除referenceToSecretObject,因此对第一个对象的引用将为0


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

我认为术语是,它存储在返回函数的LexicalEnvironment中。该对象不引用变量。它引用您使用变量分配给属性的值。我认为术语是,它存储在返回函数的LexicalEnvironment中。对象不引用变量。它引用您指定的值
通过使用变量来访问属性。否,但您可以通过闭包强制使用类似私有的变量,OP正在问这个问题。@JayGould我正在更新我的答案。谢谢,但你们可以通过闭包强制私有变量,OP就是在问这个问题。@JayGould我在更新我的答案。谢谢