我正在阅读“面向网络开发人员的专业第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
,所以如果一个实例修改了name
变量,它就不会影响其他实例?
====================================
我认为,每次用new
创建实例时,都会创建一个Person Activation Object
。每个name
中的Person Activation Object
变量是不同的。
发布于 2017-08-26 10:04:04
这种行为与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'
当然,在这里,person1
和person2
不再是同一个构造函数的实例,但是除此之外,分离变量实例和作用域的原则是相同的。
https://stackoverflow.com/questions/45894049
复制相似问题