Javascript ES5构造函数中定义的私有变量之谜

Javascript ES5构造函数中定义的私有变量之谜,javascript,closures,ecmascript-5,Javascript,Closures,Ecmascript 5,我正在阅读《面向Web开发人员的专业JavaScript第3版》中的私有变量部分,对其中一个示例代码感到困惑: function Person(name) { this.setName = function(value) { name = value; } this.getName = function() { return name; } } var person1 = new Person('p1'); person1.setName('p11'); pe

我正在阅读《面向Web开发人员的专业JavaScript第3版》中的私有变量部分,对其中一个示例代码感到困惑:

function Person(name) {
  this.setName = function(value) {
    name = value;
  }

  this.getName = function() {
    return name;
  }
}

var person1 = new Person('p1');
person1.setName('p11');
person1.getName();  // 'p11'

var person2 = new Person('p2');
person2.getName();  // 'p2'
getName方法通过闭包和作用域链访问name变量,而setName方法为name分配一个新值

问题: name变量存在于何处

为什么Person的每个实例都有不同的名称,因此如果一个实例修改了name变量,它不会影响其他实例

====================================


我认为每次使用new创建实例时,都会创建一个Person激活对象。every Person Activation对象中的name变量不同。

此行为与new无关

每次调用Person时,都会创建一个新的、单独的参数变量名实例。该函数中的代码可以访问该变量。没有别的了

这对于您可能声明的每个函数中的参数变量都是正确的。只要有可能引用这些变量,它们就会保留在内存中——它们不会被垃圾收集

调用Person两次,本质上与调用两个不同的函数没有太大区别,这两个函数都具有相同的参数和方法:

function Person1(name) {
  this.setName = function(value) {
    name = value;
  }

  this.getName = function() {
    return name;
  }
}

function Person2(name) {
  this.setName = function(value) {
    name = value;
  }

  this.getName = function() {
    return name;
  }
}

var person1 = new Person1('p1');
person1.setName('p11');
person1.getName();  // 'p11'

var person2 = new Person2('p2');
person2.getName();  // 'p2'

当然,这里的person1和person2不再是同一个构造函数的实例,但除此之外,独立变量实例和作用域的原理是相同的。

感谢您修复我的语法错误。我的英语不太好。啊。。。。那么,我仍然理解setName方法中的name变量存在于何处?我不知道你对where的意思是什么?它存在于记忆中。在每次函数调用时,都会为name参数的新实例分配新内存。除非无法再访问该内存,否则不会释放该内存。对于每个实例,setName方法也单独存在:每个setName方法将访问它可以访问的名称。所以你可以有n个setName方法,每个方法访问它们自己的名称,其中也有n个。我的意思是内存模型,就像,作用域链对于Person的每个实例是分开的。如果调用它n次,将有n个单独的作用域。见我的补充答案。