代码之家  ›  专栏  ›  技术社区  ›  Sasha Kos

以前状态保存的函数

  •  0
  • Sasha Kos  · 技术社区  · 6 年前

    我有密码

    var variable = 0;
    
    function add() {
      return variable += 1;
    }
    
    console.log(add());
    console.log(add());

    我想知道有没有一种方法只使用函数和作用域来编写这段代码,类似smth

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

    得到同样的结果。

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  5
  •   T.J. Crowder    6 年前

    …只使用一个函数…

    您的代码 仅使用一个函数( 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());
        2
  •  1
  •   KooiInc    6 年前

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

    (() => {
      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>
        3
  •  0
  •   joaner    6 年前

    也可以看到 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())