js私有变量赋值

时间:2012-08-23 20:09:14

标签: javascript closures

我在理解js如何工作方面缺少一些东西。这是问题所在:

我们宣布一个这样的模块:

ns.obj = function() {
    // declare private variables
    var test = 1, test1 = 2;

    // declare some private function
    var myFunc=function(){test=2};

        return{test:test, myFunc:myFunc};
}

每次调用myFunc时,由于我们没有在函数内声明测试,因此js应假设我们指的是私有变量。

如果我们有模块,返回的对象确保我们有test和myFunc可见。所以调用ns.obj.test应该首先给我们1。在我们调用myFunc之后应该给我们2.但它始终是1.为什么会发生这种情况?

这是jsfiddle:http://jsfiddle.net/aXuwB/1/

3 个答案:

答案 0 :(得分:1)

在JavaScript中覆盖变量不会在其他任何地方覆盖它。你有效地在你的返回对象中传递数字1;没有引用test变量。

您拥有的选项是返回一个功能。函数保存代码,因此可以保存对变量的引用。调用它会给你变量:test: function() { return test; }

答案 1 :(得分:0)

我认为这与你每次执行函数时声明一个新var test=1这一事实有关。为了澄清,每次调用ns.obj()时,您都会将新的测试变量重新分配给1,然后将其返回到您的对象中。因此,该值始终为1.

当您调用myFunc函数时,它会根据需要修改您的私有变量,但您没有一种干净的方法来访问私有变量(不再重置该值)。

看看这个,看看这是否表明你想要的东西:

var ns = {};
ns.obj = function(){
    var test = 1;
    this.myFunc = function(){
        test=2
    };
    this.getTest = function(){
        return test;
    }
}

var testObj = new ns.obj();
console.log(testObj.getTest());
testObj.myFunc()
console.log(testObj.getTest());

答案 2 :(得分:0)

var User = function () {
    var age = 0; // private
    this.incrementAge = function () { 
      return age++;
    }
    return this.incrementAge(); // closure
};

var firstUser = new User();
console.log('firstUser', firstUser.incrementAge());   // 1

var secondUser = new User();
console.log('secondUser', secondUser.incrementAge()); // 1
console.log('secondUser', secondUser.incrementAge()); // 2