Javascript 替代函数与原函数var的区别

Javascript 替代函数与原函数var的区别,javascript,Javascript,谢谢你的帮助。很抱歉,我不知道我使用的概念的确切名称 我有一个这样的函数 var counter = function() { var count = 0; function changeCount(number) { count += number; } return { increase: function() { changeCount(1); }, decrease: function() { changeCoun

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

我有一个这样的函数

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”,但答案是“0”

(二)

现在返回'3'作为答案。 这是我的问题。从字面上看,变量“另一个”与“counter()”完全相同。 那么,为什么答案会不同呢

前一个代码(counter().increase())似乎在每3行“counter().increase()”之后将“count”返回到“o”。 而'other.increase()'似乎是累积变量'count'的变化。
两个代码之间的区别只是说“变量‘另一个’与counter()相同”。为什么这会导致如此不同的答案?

看看计数器函数的作用

它创建一个变量,将其设置为0,然后返回一些函数

若你们给柜台打一次电话,它就会打一次。如果你叫它三次,它就会叫三次

(然后对返回值调用
.increase()
,在第一个示例中,这是三个不同的东西,但在第二个示例中,每次都是相同的东西)


或者换一种说法

如果,每次你打电话给
柜台
时,你都会拿一张干净的纸放在面前。每次你打电话给rease时,你都会在面前的一张纸上画一个勾号


你要么得到三张纸,每张纸上都有一个记号,要么得到一张纸上有三个记号。

看看计数器功能的作用

它创建一个变量,将其设置为0,然后返回一些函数

若你们给柜台打一次电话,它就会打一次。如果你叫它三次,它就会叫三次

(然后对返回值调用
.increase()
,在第一个示例中,这是三个不同的东西,但在第二个示例中,每次都是相同的东西)


或者换一种说法

如果,每次你打电话给
柜台
时,你都会拿一张干净的纸放在面前。每次你打电话给rease时,你都会在面前的一张纸上画一个勾号


你要么得到三张纸,每张纸上都有一个记号,要么一张纸上有三个记号。

我知道这已经得到了回答,但为了澄清(因为我已经打过了):

您的
计数器每次都返回一个新对象,每个对象都有自己的函数声明(增加、减少、显示)。因此,每次调用counter()都会得到该对象的一个新的独立实例,其函数不存在于该实例的范围之外

因此:

//这是:
计数器()增加();
//与此等效:
常数c1=计数器();
c1.增加();
//如果你反复这么做:
计数器().增加();//新实例
计数器().增加();//新实例
计数器().增加();//新实例
计数器().show();//新实例
//你实际上在做:
常数c1=计数器();
c1.增加();
常数c2=计数器();
c2.增加();
常数c3=计数器();
c3.增加();
常数c4=计数器();
c4.show();
//而这会对同一对象调用三次crease():
const另一个=计数器();
另一个。增加();
另一个。增加();
另一个。增加();

我知道这已经得到了回答,但为了澄清(因为我已经输入了):

您的
计数器每次都返回一个新对象,每个对象都有自己的函数声明(增加、减少、显示)。因此,每次调用counter()都会得到该对象的一个新的独立实例,其函数不存在于该实例的范围之外

因此:

//这是:
计数器()增加();
//与此等效:
常数c1=计数器();
c1.增加();
//如果你反复这么做:
计数器().增加();//新实例
计数器().增加();//新实例
计数器().增加();//新实例
计数器().show();//新实例
//你实际上在做:
常数c1=计数器();
c1.增加();
常数c2=计数器();
c2.增加();
常数c3=计数器();
c3.增加();
常数c4=计数器();
c4.show();
//而这会对同一对象调用三次crease():
const另一个=计数器();
另一个。增加();
另一个。增加();
另一个。增加();

可能只是使用“()”的区别()表示要在括号前执行(或打开)变量或函数

像这样稍微调整代码

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”。唯一的区别是使用了“()”。
如果你不使用“()”,这意味着你不会执行它。所以您可以处理已经打开的上下文。

可能只是使用“()”的区别()表示要在括号前执行(或打开)变量或函数

像这样稍微调整代码

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”。唯一的区别是使用了“()”。
如果你不使用“()”,这意味着你不会执行它。因此,您可以处理已打开的上下文。

谢谢您的评论。然而,变量“另一个”不是一样吗?每次我调用“另一个”时,它都会调用“计数器”函数,并且每次都执行相同的操作。创建变量,将其设置为0。但答案是‘不一样’。那为什么呢?@yubin-你从来没有给别人打过电话。它是另一个
而不是另一个()。(由于
other
不是一个函数,如果您执行了
other()
,它将抛出一个异常)
另一张
只是摆在你面前的一张纸,它不是获取一张新纸的指令集。非常感谢!!谢谢你的评论。然而,变量“另一个”不是一样吗?每次我调用“另一个”时,它都会调用“计数器”函数,并且每次都执行相同的操作。创造
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()