我需要一个js sum函数来像这样工作:
sum(1)(2) = 3
sum(1)(2)(3) = 6
sum(1)(2)(3)(4) = 10
etc.
Run Code Online (Sandbox Code Playgroud)
我听说不能这样做.但是听说如果加+在前面sum就可以做到.喜欢+sum(1)(2)(3)(4).
有关如何做到这一点的任何想法?
希望有人找到时间来解释函数和范围中的函数.我试图更多地了解变量的函数和范围,并找到了一个相当不错的教程,但这部分我只是没有得到.
任务:
创建一个像这样工作的函数sum:sum(a)(b) = a+b并接受任意数量的括号.例子:
sum(1)(2) == 3
sum(5)(-1)(2) == 6
Run Code Online (Sandbox Code Playgroud)
解决方案:
function sum(a) {
var sum = a;
function f(b){
sum += b;
return f;
}
f.toString = function() { return sum };
return f; //line 12
}
alert( sum(1)(2) ); // 3e
Run Code Online (Sandbox Code Playgroud)
说明:
要使sum(1)可调用为sum(1)(2),它必须返回一个函数.该函数可以被调用或转换为数字valueOf.解决方案真的不言自明:
我的解释:
这f在function f(b)返回到范围,该范围是从管线02 - 12 f中f.toString,为当前返回f从function(b)
接下来return f返回到其是功能以外的范围sum(a).
问题:
我无法弄清楚,我需要以不同的方式思考,因为就像我上面所描述的那样,函数不会被再次调用,那么代码的哪一部分可以使"几个括号"成为可能?
而且,我是否正确地假设f …
作为编程挑战的一部分,我们的任务是创建一个具有不确定数量的连续调用的函数.举个例子,假设函数只返回提供的参数的总和,它应该如下工作:
sum(4)() // 4
sum(4)(5)() // 9
sum(4)(5)(9)() // 18
sum(4)(5)(9)(1)() // 19
// etc...
Run Code Online (Sandbox Code Playgroud)
最后允许的空函数调用将问题简化为呼叫结束的指示.
我已经开发了一个解决方案来完成工作,但在函数本身内部使用全局变量:
var sum = function (a) {
if (!sum.init) {
sum.total = 0;
sum.init = true;
}
if (!arguments.length) {
sum.init = false;
return sum.total;
}
sum.total += a;
return sum;
};
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效,但使用状态,全局变量和函数对象技巧,这是不理想的.我的问题是,是否有办法以纯粹的递归方式解决问题.
作为旁注,如果没有提供最后一次空调(),我不相信问题可以解决,但如果我错了请告诉我.
更新
CodeReview已回答了这个问题:https://codereview.stackexchange.com/a/153999/129579
一种不依赖于全局范围且纯功能的neet解决方案.
如何定义foo以使以下代码按预期正确工作(在 JavaScript 中)?
foo[1] + 1 // 2
foo[1][2] + 1 // 4
foo[10][20][30] + 1 // 61
foo[100][200][300] + 1 // 601
Run Code Online (Sandbox Code Playgroud)
这是我曾经遇到过的一个面试题。