与js中的变量混淆

时间:2015-01-23 08:37:09

标签: javascript variables

function Person(name){
    var age;
    this.name = name;
    this.setAge = function(a){
        age = a;
    }
    this.getAge = function(){
        return age;
    }
}
var p0 = new Person("John");
p0.setAge(24);
console.log("p0.getAge "+p0.getAge());//p0.getAge 24
var p1 = new Person("Mike")
p1.setAge("25");
console.log("p0.getAge "+p0.getAge());//I think the output here should be p0.getAge 25,but it is p0.getAge 24
console.log("p1.getAge "+p1.getAge());//p0.getAge 25

变量“age”不属于Person的任何实例,因为Person的构造函数中没有“this.age”,它应该首先由Person的实例共享,但结果不是我预期的。我很困惑!

4 个答案:

答案 0 :(得分:3)

function Person(name){
    var age;
    this.name = name;
    this.setAge = function(a){
        age = a;
    }
    this.getAge = function(){
        return age;
    }
}

var age;,你不要声明this.age,当你不想从外面直接访问变量时,尤其如此,即你试图让它对那个对象是私有的,这就是为什么你不要&# 39; t为对象创建一个属性,但只是该闭包的变量。

仍然可以在对象内部访问它并使用getAge方法返回它,但不能直接使用年龄。所以没有属性age,但存在变量age

答案 1 :(得分:0)

即使age“属性”未被隐式声明为实例变量,但其范围包含在函数中。每次调用setAge()方法时,都会为age变量设置新值,如果您未在对象上调用setAge(),则age将为undefined,这是未初始化变量的默认值。它不是全局变量,因此不会跨对象共享。

答案 2 :(得分:0)

变量的范围在函数中,代码工作正常。

如果您期望单个变量,外部变量或Person.age是好方法。

答案 3 :(得分:0)

function Person(name){
    var age; //private variable
    this.name = name;
    this.setAge = function(a){
        age = a;
    }
    this.getAge = function(){
        return age;
    }
}

你已经关闭了。 closure是一个私人环境。或者在闭包(函数)中声明的变量只能用于该函数。您已经创建了构造函数person的两个实例。解析器创建了两个单独的对象,每个对象包含它自己的私有变量age。因此,当您在setAge上致电John时,他的私有变量age会更新,但Mike的私有变量保持不变。变量只能在自己的范围内访问,而不能在全局范围内访问。请注意,变量未连接到实例John。要使变量公开,您需要在构造函数函数中执行此操作:this.age

对于getter和setter,有一个新功能(在现代浏览器中可用)

Object.defineProperty

一个例子:

function Person(name){
    var age; //private variable
    this.name = name;

    var age = 0;

    Object.defineProperty(this, "age", {
        get : function(){return age;}, //has access to the private var `age` in this scope.
        set : function(value){age = value;}
    });
}

现在当您通过John致电p0.age的年龄时,您会得到0.但是当您执行p0.age = 10时,它会将私有变量age设置为10。