【问题标题】:Reseting a counter of a protected/nested variable in JavaScript在 JavaScript 中重置受保护/嵌套变量的计数器
【发布时间】:2019-09-26 04:02:55
【问题描述】:

我的目的是创建一个安全计数器并通过调用函数来重置它。我试过这段代码:

function ZeroCounter () { var c = 0 ; return function() { return ++c } }; 

const Counter = ZeroCounter();

但没有像我预期的那样工作。 ZeroCounter 不会重置 var C。我注意到function() return 创建了一个新对象。

var m = ZeroCounter(); var n = ZeroCounter();

m === n //return false

我尝试了 ZeroCounter 的新代码。

function ZeroCounter () { var c = 0 ; ret = function() { return ++c }; return ret };

事实上,没有理由产生新的结果。那么,我能做些什么来达到我的目的:创建一个可重置的嵌套变量?还是这样不行?

【问题讨论】:

  • 你想重置计数器的部分在哪里?
  • 不清楚你的问题是什么。使用此代码var m = ZeroCounter(),对m 的连续调用将产生12 等。如果您希望能够重置计数,您需要返回一个具有2 个方法的对象,一个是递增的,一个是递增的。一个要重置。
  • c 在您调用ZeroCounter() 时始终为0 并且ZeroCounter() 返回另一个函数。所以要调用嵌套函数,你必须ZeroCounter()()。这就是你要找的吗?
  • 这个想法是重置一个计数器,就问题而言,将 0 放入 var c。调用 ZeroCounter 会生成 c = 0,但似乎会创建一个新计数器(保持实际计数器 var Counter 不变。)。当被问到 m === n 时,答案是不相等,它们是由同一个函数创建的不同计数器。

标签: javascript counter nested-function


【解决方案1】:

基本上,每次执行 ZeroCounter 时,您都会重新创建 c。要解决这个问题,请将c 移出ZeroCounter

var c = 0;

function ZeroCounter() {
    return ++c;
}

var m = ZeroCounter();
var n = ZeroCounter();
console.log(m);
console.log(n);

如果您想在ZeroCounter 中包含c 但仍想要效果,请使用Immediately Invoked Function Expression or IIFE

var ZeroCounter = (function () {

    var c = 0;

    return function () {
        return ++c;
    };

}());

var m = ZeroCounter();
var n = ZeroCounter();
console.log(m);
console.log(n);

【讨论】:

  • 这样任何其他函数都可以改变var c,这意味着c不安全!
  • @DanielBandeira 只有第一个版本。 IIFE 会解决这个问题。
【解决方案2】:

您可以使用函数的参数并重置为想要的值。

function counter() {
    var c = 0;
    return function(v) { 
        if (v !== undefined) c = v;
        return ++c
    };
}

const counterA = counter();

console.log(counterA());
console.log(counterA());
console.log(counterA());
console.log(counterA(0));
console.log(counterA());
console.log(counterA());

【讨论】:

  • 哇!好近似!使用这种技术,我选择计数的起点。我想要更“自动”的东西,但无论如何,这在许多方面就足够了。谢谢
猜你喜欢
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2021-11-16
  • 2011-08-02
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多