JavaScript 中的闭包,具有多个空调用 sum 函数



我在一次采访中遇到了这个问题。我不知道如何解决这个问题。 问题:编写一个 sum 函数,它将添加 2 个数字,但数字可以通过以下方式传递给函数:

  1. 总和(3((4(//答案应为 7
  2. 总和(3((((4(//答案应为 7
  3. 总和(3((((((4(//答案应为 b 7

我可以使用闭包解决第一个函数,实际上对于第二个函数,我也可以检查参数,如果参数长度为零,我可以再次调用除下一个参数之外的总和。 但是如何使它通用?意味着即使你的第一个参数和最后一个参数也有"N"次调用,这些调用可以是空的或参数化的,它应该返回总和。

录制了一段视频如何解决它:

https://youtu.be/7hnYMIOVEg0

文本答案:

function sum(numberOne) {
return function innerSum(numberTwo) {
if (typeof(numberTwo) === 'number') {
return numberOne + numberTwo;
}
return innerSum;
}
}

输出:

sum(3)(4); => 7
sum(5)()()(10); => 15

基本上,你需要返回内部函数(innerSum(,直到你收到一个值 - 然后你返回number

您也可以为您的方法选择其他名称 - 如_sum()addToFirstNumber()

您始终可以从函数中返回函数:

let a;
function sum(value) {
if (typeof value !== "number") {
return sum;
}
if (typeof a !== "number") {
a = value;
return sum;
}
let result = a + value;
a = null;
return result;
}

见 https://jsfiddle.net/d9tLh11k/1/

function sum(num1) {
return function sum2(num2) {
if(num2 === undefined) {
return sum2;
}
return num1 + num2;
}
}
console.log(sum(4)()()()(3)); // -> 7

或者在 ES6 中:

const add = num1 => num2 => num2 === undefined ? add(num1) : num1 + num2;
console.log(add(4)()()()()()(3)); // -> 7

function add (n) {
var func = function (x) {
if(typeof x==="undefined"){
x=0;
}
return add (n + x);
};

func.valueOf = func.toString = function () {
return n;
};

return func;
}
console.log(+add(1)(2)(3)()()(6));

我已经在这里给出了这个问题的答案

但根据您的问题,我已经修改了

function add (n) {
var func = function (x) {
if(typeof x==="undefined"){
x=0;
}
return add (n + x);
};
func.valueOf = func.toString = function () {
return n;
};
return func;
}
console.log(+add(1)(2)(3)()()(6));

像这样运行代码

console.log(+add(1)(2)(3)()()(6));

这应该可以做到

function sum(num1) {
if (arguments.length === 0){
return sum;
}
return function innerSum(num2) {
if (arguments.length > 0){
return num1 + num2;
}else{
return innerSum;
}
}
}

您可以通过多种方式执行此操作,但大多数情况下,您需要命名递归。也就是说,您可以拥有类似以下内容:

sum = start => (...args) => args.length? args[0] + start : sum(start)

但是将其写成:

function sum(start) {
function out(...args) {
return args.length? start + args[0] : out
}
return out;
}

最新更新