javascript 和私有变量

javascript and private variables

我正在研究 JavaScript 中的私有变量,我理解它们的语法,但我很好奇它们如何在函数的幕后工作。

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

  1. 链接到外部函数的作用域并可以访问其变量,或者
  2. 外部函数中变量的值只是传递给内部函数(闭包)。

是哪一个,还是有什么不同我还没想到。谢谢

 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."

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

来自 ECMA 标准版本 7 规范的第 8.1 节:

A Lexical Environment consists of an Environment Record and a possibly null reference to an outer Lexical Environment.

所以实际上内部函数有一个记录它自己的变量和它们的值,还有一个指向外部函数记录它的变量和值的指针等等,直到没有更多的外部函数和全局范围达到。

虽然 LexicalEnvironment 是对 ECMA 脚本如何工作的描述性抽象,但实际上这意味着如果您将对内部函数的引用保存在其作用域链之外,它在任何地方使用的变量在其私有的非全局作用域链中,只要一个或多个内部函数可以访问它们,就不能进行垃圾回收。

可能可以优化内存垃圾收集,以收集由 no 继续存在的内部函数 actually 访问的值所使用的内存,但是我没有更多信息 - 请参阅有用的评论。