我的一位朋友问我关于关闭的问题,他希望我解决问题。这是问题:
编写一个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
}
但我的问题是,有没有找到该用户调用封闭属性的原因?
答案 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;
}