javascript更改对象变量引用

javascript更改对象变量引用,javascript,object,reference,Javascript,Object,Reference,我是javascript新手,有人能解释一下为什么这个代码不起作用吗 var User = function () { var userId = 0; var clear = function () { userId = 0; } return{ clear:clear, userId:userId, } } ... // in mocha test: var john = new User(); joh


我是javascript新手,有人能解释一下为什么这个代码不起作用吗

var User = function () {
    var userId = 0;
    var clear = function () {
        userId = 0;
    }
    return{
        clear:clear,
        userId:userId,
    }
}

...
// in mocha test:

var john = new User();
john.userId = 666;
john.userId.should.equal(666); // true
john.clear()
john.userId.should.equal(0); // false

关于

您正在返回一个对象

 return{
    clear:clear,
    userId:userId,
}

它没有id属性,但有userId。

您缺少this关键字

var User = function () {
    var userId = 0;
    var clear = function () {
        this.userId = 0;
    }
    return{
        clear:clear,
        userId:userId,
    }
}

您所做的就是创建一个。这意味着在
clear
函数中,
userId
被创建为局部变量,并与全局
User.userId
的作用域分开

您需要做的是使用
this
关键字指定您试图更改的
userId
是全局ID

var User = function () {
    var userId = 0;
    var clear = function () {
        this.userId = 0;
    }
    return{
        clear:clear,
        userId:userId,
    }
}
在clear方法中引用属性时,需要使用“this”

var clear = function () {
    this.userId = 0;
}

这里有几个问题

1:
userId
在函数定义中未定义


2:
user
未定义,因此
user.clear()
也未定义(实际上,我很惊讶您的代码不会崩溃)。您的意思是
john.id
john.clear()。然后继续引用一个名为
user
user.id
id
的未声明变量。一个是其他语言所称的
public
,而另一个是
private
。它们可能共享名称,但指向不同的内存位置。抱歉,输入错误。更新了问题。我为你做了一把小提琴。var john=new User(),然后u引用用户?try john.clear()在定义用户“类”之前尝试删除var。只需执行User=function(){},尽管
var userId=0是多余的。@Sirko如果没有它,代码将出错(至少在我的运行时)!请参阅控制台中的错误:确保它会发生,因为返回的对象中存在引用。你必须直接在那里设置零。啊,我误解了-你说在那个地方初始化是没有意义的。在这个例子中,有两个指向同一个值的指针是没有意义的,是的。我认为这两个都是打字错误-提问者编辑了他的问题以反映这一点。事实上,当我键入答案时。OP问为什么他们的代码不起作用,但发布了一些充满拼写错误的内容。。。。。。。。。