0

我在理解 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调用,因为我们没有在函数内声明 test js 应该假设我们指的是私有变量。

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

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

4

3 回答 3

1

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

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

于 2012-08-23T20:13:59.370 回答
1
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
于 2018-02-12T15:27:08.323 回答
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());
于 2012-08-23T20:24:41.050 回答