我在前几天看到这个关于Javascript的问题,一个函数应该根据函数中括号调用的数量返回一些值。
console.log(f() == 1); //->true
console.log(f()() == 3); //->true
console.log(f()()() == 6); //->true
... //and so on 10,15,21...
我想出了以下代码:
function f() {
f.count++;
return f;
};
f.count=0;
f.toString = function(){
console.log(f.count);
return f.count;
};
console.log(f() == 1); // true
console.log(f()() == 3); //3
console.log(f()()() == 6); //6

但是,例如,如果我打电话,这将会破裂:
f();
console.log(f() == 1); // true
console.log(f()() == 3); //3
console.log(f()()() == 6); //6
我理解为什么。但是,我的问题是:如何以函数可以判断使用了多少括号并且独立于其他调用的方式进行递归?
例如,当我说f()
得到1并且我说f(); f();
得到1和1.而不是1和2时。
我知道这可能与变量的范围有关(我试图遵循这个:What is the scope of variables in JavaScript?),但是对于我的例子,我的尝试没有成功。
答案 0 :(得分:3)
每次调用f
时都需要使用一个新计数器,然后返回一个不同的函数,以便该函数不会重置计数器。
此外,在ES6中,您可以使用this
将计数跟踪为原始数字:
function f() {
const g = f.bind((+this || 0)+1);
g.toString = () => (+this+1) * (+this+2)/2 || 1;
return g;
}
console.log('' + f()); // 1
console.log('' + f()()); // 3
console.log('' + f()()()); // 6
console.log('' + f()()); // 3