javascript - 如何使用柯里化(Currying)应用?

标签 javascript currying

我的代码使用柯里化(Currying)来获取连接两个数组的数组的平均值:一个 n 大小的数组和一个 m 大小的数组。

var avg = function(...n){ 
  let tot=0;
  for(let i=0; i<n.length; i++){
    tot += n[i];
  }
  return tot/n.length;
};

var spiceUp = function(fn, ...n){
  return function(...m){
    return fn.apply(this, n.concat(m));
  }
};

var doAvg = spiceUp(avg, 1,2,3);
console.log(doAvg(4,5,6));

return fn.apply(this, n.concat(m));这一行,我不明白为什么我们需要使用apply。我们与平均函数绑定(bind)的对象是什么?为什么正常调用 (return fn(n.concat(m));) 不起作用?

最佳答案

在那个例子中,this 并不是那么重要。如果您改为传递一个空对象,它也会起作用。这只是一个关于如何使用 apply 的示例。

你需要关注的是第二个参数n.concat(m)。他们这里的关键概念是将数组作为第二个参数传递,您调用该函数 (fn) 将数组中的每个值作为参数传递。

关于你的第二个问题:不,它不会工作,因为 fn 在执行 return fn(n.concat(m )); 你只是传递一个参数,一个包含所有值的数组

也许你会通过一个更简单的例子更好地理解它:

function sum3params(a,b,c){
    return a+b+c;
}

console.log(sum3params([3,4,2])) // won't work
console.log(sum3params.apply(this, [3,4,2])) // will work ('this' is not important here)

关于javascript - 如何使用柯里化(Currying)应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42303841/

相关文章:

javascript - 用 html 按钮替换字符串中的自定义标记

javascript - Meteor Startup JQuery DOM 元素未就绪(JQueryUI 可拖动)

haskell - 在严格的、不纯粹的语言中,柯里化(Currying)/偏应用如何工作?

function - 如何解释方法调用?

javascript - 将静态内容插入 jQuery UI 菜单小部件

javascript - 在 jquery 中添加 <li> 标签不起作用

javascript - 如何在 React 中使用外部 api

javascript - 什么是 'Currying' ?

functional-programming - 如何在不创建闭包的情况下调用多参数函数?

haskell - 带有中缀函数的偏应用