我在理解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/
答案 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