在JavaScript中未重置对象中的属性

在JavaScript中未重置对象中的属性,javascript,Javascript,我正在看一个JavaScript练习,结果有点混乱 在下面的代码中,每次调用“counter”时,输出到控制台的“i”的值都会增加,但在构造函数中,在对象代码的开头,“i”会重置为“0”,因此每次调用“counter”时都应该返回“1” 为什么每次调用“计数器”时“i”不会重置为“0” 提前谢谢!: function makeCounter() { var i = 0; return function() { console.log( ++i ); }; } v

我正在看一个JavaScript练习,结果有点混乱

在下面的代码中,每次调用“counter”时,输出到控制台的“i”的值都会增加,但在构造函数中,在对象代码的开头,“i”会重置为“0”,因此每次调用“counter”时都应该返回“1”

为什么每次调用“计数器”时“i”不会重置为“0”

提前谢谢!:

function makeCounter() {

   var i = 0;

   return function() {
     console.log( ++i );
   };
}

var counter = makeCounter();
counter(); //Output is 1.
counter(); //Output is 2.
counter(); //Output is 3...
记住:调用计数器并不调用makeCounter。它调用makeCounter返回的函数。因为返回的函数不会重置i的值,所以我永远不会重置

仅当调用makeCounter时,i才设置为0。正如代码所示,makeCounter只被调用一次。

i不会每次都被更改,因为您没有更新i,而是通过闭包访问i,所以第一个函数只被调用一次

要更新它,请执行以下操作

函数生成计数器{ 返回函数{ var i=0; console.log++i; }; } var计数器=makeCounter; 计数器//输出为1。
计数器//输出为1。您正在调用具有相同i变量的相同计数器,不应重置它,因为它将调用var i=0;只有当您实例化计数器时,它才会继续调用++i来增加它,如果您想要为它添加新值,请调用新计数器:

function makeCounter() {
   var i = 0;
   return function() {
     console.log( ++i );
   };
}
var counter = makeCounter();
counter(); //Output is 1.
counter(); //Output is 2.
counter(); //Output is 3...
var second = makeCounter();
second(); //Output is 1.

如果要重置计数器,必须再次调用makeCounter,因为它只返回使用计数器访问的函数。闭包的概念只会记住返回的函数。

Hi@EKW可能重复,谢谢您的回复。现在您提到“var i=0”只在调用构造函数makeCounter时执行一次是有道理的,但是“i”的值是否因为方法没有改变而没有改变?或者换句话说,在构造函数完成其工作并为“i”设置内存空间之后,赋值语句var将被忽略?对象中的属性只能通过对象的方法调用进行变异吗?希望这有意义??:@这表明它没有被忽视。它永远不会被执行,因为它永远不会被告知再次执行该部分。记住,计数器不调用makeCounter。调用计数器只是执行console.log++i.or语句'var i=0;'调用对象“counter”时忽略,因为实例中已经存在“i”,并且JS引擎足够聪明,可以理解这一点?不会忽略它。计数器不包括var i=0,因为它不包含在函数中。它不会被忽略,因为计数器首先不包括该行。计数器是从makeCounter返回的函数。makeCounter中有var i=0,但计数器没有,因为。。。我们来看看返回的函数。事实并非如此,你把我揍了一顿;因此,当直接调用“counter”时,而不是说通过方法访问时,返回的唯一内容是显式返回的内容,或者如果nothing is nothing显式声明返回整个对象?这只是对一个对象的调用,对象返回它自己或者内部告诉它返回的任何东西?Hi@zabusa。感谢您花时间研究这个问题:“我”是否可以通过闭包访问,因为“counter”是一个命名对象,所以应该将其所有属性都放在内存中?如果“counter”是一个被传递的对象,它将使用一个包含代码引用的所有内容的闭包,直到没有任何引用它,然后得到GC'd?感谢您输入Ashar,非常感谢:感谢您输入Mosabbir,非常感谢: