具有“经典”功能的闭包计数器不起作用,但是对于IIFE,它起作用。为什么?

时间:2018-10-27 19:51:51

标签: javascript closures

我有两个计数器实现(对我而言)似乎相同,这是我的代码:

var fakeCounter = function() {
    var i = 0;
    return function() {
        return i++;
    }
};

// And

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

// And here the confusion:

console.log(fakeCounter()()); // 0
console.log(fakeCounter()()); // 0
console.log(fakeCounter()()); // 0

console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

因此,第一个计数器不起作用,而第二个计数器不起作用。而且我不知道为什么,因为在我的脑海中counter()等于fakeCounter()()。 有人可以澄清吗?

1 个答案:

答案 0 :(得分:-1)

您同时是对还是对:fakeCounter()()counter()相同,但仅在被调用一次时

  • 它们的相似之处:
    • fakeCounter()var counter的IIFE一样,创建一个带有闭包的函数。
    • 下一个()调用该函数。
  • 它们有何不同:
    • fakeCounter()每次都会创建一个 new 函数,该函数会在其中捕获自己的var i
    • IIFE仅被调用一次,因此仅存在一个 var i

我鼓励您尝试以下代码:

let a = fakeCounter();   // a is a counter
let b = fakeCounter();   // as is b
// ... but are they the same? Hmmmm...
console.log(a === b);   // false  -- Nope, they are separate functions

console.log(a());         // 0
console.log(a());         // 1
console.log(a());         // 2

console.log(b());         // 0
console.log(b());         // 1
console.log(b());         // 2

console.log(counter());   // 0
console.log(counter());   // 1
console.log(counter());   // 2