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

ES5 puzzle of private variable defined in constructor

我正在阅读"Professional JavaScript for Web Developers 3rd Edition"中的私有变量部分,对其中一个示例代码感到困惑:

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,这样如果一个实例修改 name 变量就不会影响其他实例?

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

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

此行为与 new 无关。

每次调用 Person 时,都会创建参数变量 name 的一个新的独立实例。该函数内的代码可以访问该变量。仅此而已。

这适用于您可能声明的每个函数中的参数变量。只要可以引用此类变量,它们就会保留在内存中——它们不会被垃圾回收。

调用 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'

当然这里的person1person2不再是同一个构造函数的实例,但除此之外变量实例和作用域分开的原理是一样的