感谢您的帮助。很抱歉,不知道我使用的概念的确切名称。
我有这样的功能。
var counter = function() {
var count = 0;
function changeCount(number) {
count += number;
}
return {
increase: function() {
changeCount(1);
},
decrease: function() {
changeCount(-1);
},
show: function() {
alert(count);
}
}
};
现在,我要使用此功能将“ 3”设置为“ 3”,
1)
counter().increase()
counter().increase()
counter().increase()
counter().show()
我猜想这会抛出“ 3”,但是答案是“ 0”。
2)
var another = counter();
another.increase();
another.increase();
another.increase();
another.show()
现在,它返回“ 3”作为答案。 这是我的问题。从字面上看,变量“另一个”与“ counter()”相同。 那么,为什么答案会有所不同?
以前的代码(counter()。increase())似乎每隔3行'counter()。increase()'将'count'返回为'o'。 而“ another.increase()”似乎累积了变量“ count”的变化。 两种代码之间的区别只是说“变量“另一个”与counter()相同”。为什么会导致如此不同的答案?
答案 0 :(得分:3)
看看计数器功能是什么。
它创建一个变量,将其设置为0,然后返回一些函数。
如果您呼叫一次计数器,它将执行一次。如果您调用它三次,那么它将执行三次。
(然后您在返回值上调用.increase()
……在您的第一个示例中,是三件事不同,但在第二个示例中,每次都是同一件事)。< / p>
或者换一种说法。
如果,每次您打电话给counter
时,都要拿一张干净的纸放在您的面前。每次您打电话给increase
时,都会在您面前的纸上划一个勾。
您要么得到三张纸,每张纸上有一个勾号,要么得到一张纸,上有三个勾号。
答案 1 :(得分:2)
我看到已经回答了这个问题,但是为了澄清起见(并且因为我已经输入了它):
您的counter
每次都会返回一个新对象,每个对象都有其自己的函数声明(增加,减少,显示)。因此,每次调用counter()时,您都会获得该对象的一个新的独立实例,并且该对象的功能不在该实例的 scope 之外。
如此:
// this:
counter().increase();
// is the equivalent of this:
const c1 = counter();
c1.increase();
// and if you do it repeatedly:
counter().increase(); // new instance
counter().increase(); // new instance
counter().increase(); // new instance
counter().show(); // new instance
// you're effectively doing:
const c1 = counter();
c1.increase();
const c2 = counter();
c2.increase();
const c3 = counter();
c3.increase();
const c4 = counter();
c4.show();
// whereas this calls increase() three times on the same object:
const another = counter();
another.increase();
another.increase();
another.increase();
答案 2 :(得分:0)
可能只是使用'()'的区别。 “()”表示您将在括号之前执行(或打开)变量或函数。
像这样调整代码
var counter = (function() {
var count = 0;
function changeCount(number) {
count += number;
}
return {
increase: function() {
changeCount(1);
},
decrease: function() {
changeCount(-1);
},
show: function() {
alert(count);
}
}
})();
counter.increase()
counter.increase()
counter.increase()
counter.show()
然后返回“ 3”。唯一的区别是使用“()”。 如果您不使用'()',则表示您不会执行它。这样您就可以处理已经打开的上下文。