javascript和私有变量

时间:2017-03-21 15:27:22

标签: javascript closures private-members

我正在研究JavaScript中的私有变量,我理解它们的语法,但我很好奇他们如何在功能方面更多地工作。

似乎在另一个函数中声明的函数,即使在被保存为外部变量的对象值之后,也是

  1. 链接到外部函数的范围并可以访问其变量OR
  2. 外部函数中变量的值只是传递给内部函数(闭包)。
  3. 它是哪一个或者是我没有想到的不同之处。感谢

     function Cat(name,amt){
        this.name=name;
        let num=amt;//private
        let num2=5;//private
        this.add=function(){//is privileged and has access to variables during object creation and is public
            return num+num2;
        }
    }
    Cat.prototype.scratch=function(){
        let amt= this.add();
        console.log(this.name + " scratched " + amt + " times." );
    }
    
    let spots= new Cat("spots", 5);
    
    Spots.scratch()// prints "spots scratched 10 times."
    

1 个答案:

答案 0 :(得分:1)

函数中变量的名称和值保存在函数在其词法环境中执行和保存时创建的环境记录中。

从ECMA标准第7版规范的第8.1节开始:

  

词汇环境包括环境记录和   可能是对外部词汇环境的空引用。

因此实际上内部函数有自己的变量及其值的记录,以及指向外部函数的变量和值的记录的指针等等,直到没有更多的外部函数和全局范围已经到达。

虽然 LexicalEnvironment 是ECMA脚本工作原理的描述性抽象,但实际上这意味着如果保存对其范围链之外的内部函数的引用,它在其私有的任何位置使用的变量,非 - 只要内部函数或内部函数可以访问它们,就不能对全局scrope链进行垃圾收集。

可能会优化内存垃圾收集以收集由 no 内部函数继续存在实际访问的值所使用的内存,但我没有进一步的信息 - 请参阅评价。