具有先前状态保存功能

时间:2018-06-22 14:30:45

标签: javascript

我有一个密码

var variable = 0;

function add() {
  return variable += 1;
}

console.log(add());
console.log(add());

我不知道有没有办法仅使用函数和范围来编写此代码,就像

function add() {
  /* SET INITIAL STATE IF NOT SET*/
  /* EXECUTE */
  /* RETURN NEW VAL */
}

add(); /* RETURN 1*/
add(); /* RETURN 2*/

获得相同的结果。

谢谢。

3 个答案:

答案 0 :(得分:5)

  

...仅使用一个功能...

您的代码确实仅使用一个功能(add)。如果您不希望它在variable上结束,则可以将计数存储在其他位置,例如作为函数本身的属性:

function add() {
  if (!add.variable) {
    add.variable = 0;
  }
  return ++add.variable;
}

console.log(add());
console.log(add());
console.log(add());

但是,当然,这意味着任何代码都可以访问和更改它。

通常的做法是关闭变量,然后将其隐藏在其他任何人都看不到的范围内:

var add = (function() {
  var variable = 0;
  return function add() {
    return ++variable;
  };
})();

console.log(add());
console.log(add());
console.log(add());

答案 1 :(得分:1)

您可以为该函数创建一个伪静态变量:

(() => {
  document.querySelector("#test").addEventListener("click", () => console.log(add(1)));
  function add(n) {
    add.constant = add.constant || 0;
    add.constant += n;
    return add.constant;
  }
})()
<button id="test">add 1</button>

答案 2 :(得分:0)

还可以看到yield运算符(generator functions)或console.count()

var add = function () {
  var generate = function *inc() {
    var i = 0
    do {
      i++
      yield i
    } while(true)
  }()
  return function() {
    return generate.next().value
  }
}()

console.log(add())
console.log(add())
console.log(add())