替代函数和原始函数var

时间:2020-03-12 15:28:44

标签: javascript

感谢您的帮助。很抱歉,不知道我使用的概念的确切名称。

我有这样的功能。

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()相同”。为什么会导致如此不同的答案?

3 个答案:

答案 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”。唯一的区别是使用“()”。 如果您不使用'()',则表示您不会执行它。这样您就可以处理已经打开的上下文。