如何解决这个JavaScript闭包函数?

时间:2018-05-20 13:21:18

标签: javascript function closures

我的一位朋友问我关于关闭的问题,他希望我解决问题。这是问题:

编写一个sum方法,该方法在使用

下面的语法调用时将正常工作
console.log(sum(2,3));   // Outputs 5
console.log(sum(2)(3));  // Outputs 5

我已经解决了这个问题:

function sum(a,b){
  function abc (c){
    return a + c;
  }
  return Boolean(b)?a + b: abc
}

但我的问题是,有没有找到该用户调用封闭属性的原因?

2 个答案:

答案 0 :(得分:0)

我认为你会选择这样的事情:

function sum(a, b) {
  function doSum(c) { return a + c; }
  return b === undefined ? doSum : doSum(b);
}

console.log(sum(3, 5));
console.log(sum(3)(5));

// another way of using the returned function
const add3 = sum(3);
console.log(add3(5));

如果未提供第二个参数,则此'sum'函数会传回另一个函数。即使在返回函数后,内部'doSum'函数仍然可以引用'a'。这使得'doSum'能够在调用时使用'a'的值来执行添加。

这是一个名为currying的函数式编程技术的例子。

Currying依赖于一个闭包,在这个例子中通过定义内部函数'doSum'来创建,该函数保留对声明它们时可访问的局部变量(例如'a')的访问。更多关于closure

最后,您的一条评论意味着您对如何更动态地应用此currying技术感到好奇。有一个名为Ramda的库,旨在为函数式编程提供JS工具包,并实现这样的currying函数。以下是他们的文档中的一个示例:

var sumArgs = (...args) => R.sum(args);
var sumFour = R.curryN(4, sumArgs);
console.log(sumFour(1, 2, 3, 4));
console.log(sumFour(1, 2, 3)(4));
console.log(sumFour(1, 2)(3, 4));
console.log(sumFour(1)(2)(3)(4));
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

答案 1 :(得分:-1)

你的意思是什么?

function sum() {
  sum.value = [...arguments].reduce((sum, val) => sum+val, 0) + sum.value || 0; 
  sum.toString = () => {
    return sum.value;  
  }
  return sum;
}