【问题标题】:Making counter using closure and self-invoking function使用闭包和自调用函数制作计数器
【发布时间】:2013-07-28 16:12:16
【问题描述】:

我想知道为什么这段代码不起作用,

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

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

而这段代码确实如此。唯一的区别是让函数自调用而不是在 console.log() 中调用它

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

console.log(uniqueInteger());  // 0
console.log(uniqueInteger());  // 1
console.log(uniqueInteger());  // 2 
console.log(uniqueInteger());  // 3

我对 JS 很陌生,所以请原谅我的菜鸟。谢谢!

【问题讨论】:

  • 不同之处在于,在您的第一个示例中,您总是调用uniqueInteger,因此总是重新定义变量counter

标签: javascript closures self-invoking-function


【解决方案1】:

第二个代码只用var counter = 0 创建了一个闭包,因为在定义 uniqueInteger 时,它调用了一个函数,该函数返回一个已完成初始化的函数。每次调用时,第一个代码都会创建var counter = 0

请注意,您可以使用第一个代码:

ui = uniqueInteger();
console.log(ui()); // 0
console.log(ui()); // 1
ui2 = uniqueInteger();
console.log(ui()); // 2
console.log(ui2()); // 0
console.log(ui()); // 3
console.log(ui2()); // 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2016-08-02
    • 2016-04-20
    • 2018-06-03
    • 2020-10-14
    相关资源
    最近更新 更多