首页 文章

使用对象引用在Javascript中“关闭”:存储“私有变量”的位置?

提问于
浏览
2

免责声明:这可能是一个愚蠢的问题,但这是让我在学习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 回答

  • 1

    在你的功能内:

    • 变量 _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 点,第一个对象将被垃圾收集 .

  • -2

    在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
    

相关问题