我有一个密码
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*/
获得相同的结果。
谢谢。
答案 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())