免责声明:这可能是一个愚蠢的问题,但这是让我在学习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 回答
在你的功能内:
变量
_secretObject
,其值为对象的引用具有属性
referenceToSecretObject
的第二个对象,该对象具有对同一对象的引用您正在调用该函数并将返回值(第二个对象)分配给
safebox
.此时功能结束 .
The variable _secretObject drops out of scope. There is nothing that can access it. The variable is cleaned up. It no longer exists.
用于引用的对象
_secretObject
仍然存在,因为第二个对象仍引用它(并且第二个对象由safebox
引用) .如果你当时,例如
safebox = null
那么对第二个对象的引用就会消失 .这将留下0引用第二个对象,因此它将被垃圾收集 .
这将摆脱
referenceToSecretObject
所以将有0个引用第一个对象 .在 this 点,第一个对象将被垃圾收集 .
在Javascript中,没有像PHP中的
private variables
或private functions
这样的东西 . 下划线标志只是一种惯例 .你可以玩闭包,有点像“私人变量” . 例如 :