访问javascript闭包中的变量

时间:2015-07-26 23:17:55

标签: javascript closures

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

这是一个自我调用的函数,可以创建一个私有的"变量。如何创建一个将计数器重置为0的函数reset?我尝试在闭包内声明函数,但是当我使用add.reset()调用它时,它告诉我这个方法是未定义的。

理解任何帮助都表示赞赏!

4 个答案:

答案 0 :(得分:4)

我建议不要试图将函数放在闭包中,而是将变量放在闭包之外,如下所示:

var counter = 0;

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

var reset = function() {
    counter = 0;
};

这样,变量具有适合您尝试使用它完成的范围。

答案 1 :(得分:4)

您应该将重置函数作为IIFE返回的对象的方法返回。该对象需要是 add 函数,因此将reset方法放在其上。就像在全局上下文中那样做,但在闭包内并返回 add 函数,例如:

var add = (function(){
  var counter = 0;

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

  add.reset = function(){
    counter = 0;
    return counter;
  }

  return add;
}())

console.log(add(1)) // 1
console.log(add(4)) // 5
console.log(add.reset()); // 0

但是,对我来说,拥有计数器对象添加重置方法会更有意义。

答案 2 :(得分:1)

如果要显式保持在闭包内声明的计数器,则需要在闭包之外声明重置(即使你没有给它一个值)。要使用您的代码,它将如下所示:

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

现在重置超出了add函数的范围,因此它保留了在其中分配的值!

公平地说,没有理由在每次添加结果时分配重置...最好做一些事情:

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

或者更好的是,如果您希望add.reset()能够工作:

var counter = function () {
    var counter = 0;
    this.reset = function() {
        counter = 0;
    }
    this.add = function () { 
        return counter += 1;
    }
};
var add = new counter();

然后添加是一个完整的对象,或多或少听起来像你想要的那样。

或者如果你想坚持自我调用功能:

var add = (function () {
    var counter = 0;
    return function () { 
        this.reset = function() {
            counter = 0;
        }
        return counter += 1;
    }
})();

可能会工作。从我所看到的情况来看,这将是一个不同寻常的范例......

答案 3 :(得分:0)

如果您想保留当前计数的隐私,这是一个使用对象的答案:

function counter() {
   var count = 0;

   this.reset = function() {
       count = 0;
       return count;
   };

   this.add = function() {
       return ++count;
   };
}

然后例如:

var counter1 = new counter();
counter1.add();
console.log(counter1.add());
console.log(counter1.reset());