访问在JavaScript闭包变量(accessing variables in javascrip

2019-10-24 04:59发布

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

这是自调用函数创建一个“私人”的变量。 我将如何创建一个功能reset ,将计数器重置为0? 我试着声明瓶盖内的功能,但是当我打电话使用add.reset(),它告诉我这个方法是不确定的。

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

Answer 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;
    }
})();

可能会工作。 这将是从我所看到的,虽然稍不寻常的模式...



Answer 2:

您应该返回复位功能由IIFE返回的对象的方法。 该对象必须是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

但是,它会更有意义(我)有一个计数器对象已添加reset方法。



Answer 3:

我建议,而不是试图把你的函数闭包中,你把你的变量闭包之外,就像这样:

var counter = 0;

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

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

这样的变量要尝试用它来完成的适当范围。



Answer 4:

如果你想保持你的当前计数的隐私,这里是使用对象的答案:

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());


文章来源: accessing variables in javascript closures