您好我对这个Javascript函数感到困惑:
var currying = function(a) {
return function(b){
return function(c){
return function(d){
return a + b /c * d;
};
};
};
};
var a = currying(4)(8);
var b = a(2)(6);
console.log(b);
它输出28但我不确定Javascript是如何评估该功能的。我也知道a = 4,b = 8,c = 2,最后是d = 6.感谢能够解释这个功能的人。
答案 0 :(得分:3)
当你使用currying时,你正在编写一个带有一个参数的函数,它将返回一个接受下一个参数的函数,直到提供所有参数。
在这种情况下,你需要调用返回的函数4次,直到你到达最后一个函数并评估所有的参数。
这很好,因为您可以在代码执行期间的不同时间传入参数,并且可以使用已在最终函数的闭包中设置的参数创建新函数。例如
const fourPlusTwo = currying(4)(2)
现在您可以在代码中的任何位置使用新函数fourPlusTwo
,并且您将在剩余的两个函数的闭包中创建这些参数。
您拥有的代码是非标准示例,但如果您需要在整个应用中计算税收,则可以执行类似的操作。
const inclusiveTax = rate => amount => {
return '$' + (amount * (rate / (100 + rate))).toFixed(2)
}
const norwayIncomeTax = inclusiveTax(60.2)
const strayaIncomeTax = inclusiveTax(32.5)
const muricaIncomeTax = inclusiveTax(31.5)
console.log(
norwayIncomeTax(50000),
strayaIncomeTax(50000),
muricaIncomeTax(50000)
)
只使用一个功能,您就可以计算3个不同国家/地区的税率,并返回等待该金额的功能。
答案 1 :(得分:1)
这是一种名为 Closures
的词汇范围基本上:闭包是函数中的一个函数,可以访问所有父变量和参数。由于javascript中的每个参数都默认通过引用传递,它甚至可以修改父变量,以便稍后执行父函数来查看更改。最好的例子是jquery的ready
函数,它包含了所有其他函数。
您可以在此处详细了解:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
答案 2 :(得分:1)
这是 currying 的一个非常复杂的例子 - 因此是主要功能的名称。
Currying起源于函数式编程领域,并且为了完全理解它,我建议你做一些阅读,特别是当它在javascript中实现时。
给你一些指示:
在行中:
var a = currying(4)(8);
第一个函数用参数4调用;该函数调用的结果是另一个函数,然后使用参数8立即调用。
最终,所有发生的事情都是:
return a + b / c * d;
对于每个相应的变量,执行值为4,8,2和6的。
应用正常的算术规则给你28的答案(先划分,然后乘法,最后加)。
答案 3 :(得分:1)
你应该知道函数对象和函数调用之间的区别。
像:var a = function(v){return v + 1;}
a是一个函数对象。然后a(2)
调用函数a。
尝试逐步了解该过程。
currying
是一个返回另一个函数的函数。
所以currying(4)
返回一个函数(a给定值为4):
function(b){
return function(c){
return function(d){
return 4 + b /c * d;
};
};
};
};
然后currying(4)(8)
也是' var a'返回另一个函数:
function(c){
return function(d){
return 4 + 8 /c * d;
};
};
};
调用a(2)
返回一个函数对象:
function(d){
return 4 + 8 / 2 * d;
};
};
a(2)(6)
返回4 + 8 / 2 * 6
,即28。