gpt4 book ai didi

javascript - Javascript 中的 "Closure"使用对象引用 : where are "private variables" stored?

转载 作者:行者123 更新时间:2023-11-30 06:50:40 26 4
gpt4 key购买 nike

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

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

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

也就是说,即使在封闭函数返回之后,闭包机制仍会维护变量_privateVariable

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

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”中有一个(共享)引用。但这不是关闭(据我了解)。是不是就是这样,变量仍然存在,因为即使在函数返回后仍有对它的引用(不是垃圾回收)?我只是感到困惑,因为它在形式上似乎接近于关闭,但也许我只是看到一些纯粹巧合的相似之处。

最佳答案

在你拥有的函数中:

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

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

此时函数完成。

What happens if the private variable is an object to which a reference is maintained after the enclosing function returns?

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

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

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

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

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

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

关于javascript - Javascript 中的 "Closure"使用对象引用 : where are "private variables" stored?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51301359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com