Javascript ES5构造函数中定义的私有变量之谜
我正在阅读《面向Web开发人员的专业JavaScript第3版》中的私有变量部分,对其中一个示例代码感到困惑: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
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个单独的作用域。见我的补充答案。