免责声明:这可能是一个愚蠢的问题,但这使我在学习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”中有一个(共享的)引用。但这不是闭包(据我了解)。只是因为变量即使在函数返回后仍然存在,因为仍然有对它的引用(不是垃圾回收),所以变量仍然存在吗?我只是感到困惑,因为它在形式上似乎接近闭包,但也许我只是看到一些纯属巧合的相似之处。
答案 0 :(得分:1)
在您拥有的功能内:
_secretObject
的值是对对象的引用referenceToSecretObject
的第二个对象,该对象具有对同一对象的引用您正在调用该函数,并将返回值(第二个对象)分配给safebox
。
功能到此结束。
如果私有变量是封闭函数返回后对其保留引用的对象,会发生什么?
变量_secretObject
超出范围。没有什么可以访问它。变量被清除。它不再存在。
用于引用的对象_secretObject
仍然存在,因为第二个对象仍引用它(第二个对象由safebox
引用)。
例如,如果要使用safebox = null
,则对第二个对象的引用将消失。
这将对第二个对象保留0个引用,因此将对其进行垃圾回收。
这将摆脱referenceToSecretObject
,因此对 first 对象的引用将为0。
在此时,第一个对象将被垃圾回收。
答案 1 :(得分:-2)
在Javascript中,没有像PHP中的private variables
或private 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