Closure JavaScript(简单)计数器的不同输出

时间:2018-09-04 14:15:29

标签: javascript closures output counter difference

请问有人可以告诉我闭包JS计数器的这种不同输出。

第一个代码段 其中输出从0开始:

var counter = (function() {
    var count = 0;
    return function() {
        return count++;
    }
}());
console.log(counter()); // output: 0
console.log(counter()); // output: 1
console.log(counter()); // output: 2

第二个片段 其中输出从1开始:

var add = (function() {
    var counter = 0;
    return function() {
        counter++;
        return counter;
    }
})();

console.log(add()); // output: 1;
console.log(add()); // output: 2;
console.log(add()); // output: 3;

为什么它会那样工作?为什么第一个输出从0开始,第二个输出从1开始?谢谢。

2 个答案:

答案 0 :(得分:2)

counter++;在后​​缀位置有++运算符,它告诉它先返回counter的值,然后再返回。因此,在您的第一个示例中,就是这样:返回0,然后增加到1;然后返回1,然后增加到2,依此类推。

在第二个示例中,counter++仍将首先返回并在其后递增,但由于增量行没有左手,因此它并不关心增量操作的返回值。然后,下一行将返回现在增加的值。

也可以在前缀位置使用++,在这种情况下,它将先递增然后返回。您可以使用它来修改第一个示例,以输出1、2、3。

const counter = (function() {
    let count = 0;
    return function() {
        return ++count; //<--- changed to prefix
    }
}());
console.log(counter()); // output: 1
console.log(counter()); // output: 2
console.log(counter()); // output: 3

答案 1 :(得分:0)

第一个代码段

return count++;

等效于:

temp = count;
count = count + 1;
return temp;

所以它从0开始

第二个片段

count++;
return count;

等效于:

temp = count;
count = count + 1;
return count;

所以它的初始值为1;

预增加

const counter = (function() {
  let count = 0;
  return function() {
    return ++count;
  }
}());

这将导致先增加count的值,然后返回其值 等同于:

const counter = (function() {
  let count = 0;
  return function() {
    count = count + 1;
    return count;
  }
}());

发布增量

const counter = (function() {
  let count = 0;
  return function() {
    return count++;
  }
}());

这将导致先增加count的值,然后返回其值 等同于:

const counter = (function() {
  let count = 0;
  return function() {
    temp = count;
    count = count + 1;
    return temp;
}
}());