Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何与咖喱一起使用?_Javascript_Currying - Fatal编程技术网

Javascript 如何与咖喱一起使用?

Javascript 如何与咖喱一起使用?,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){ re

我有一段代码,它使用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));
var avg=函数(…n){
设tot=0;

对于(让i=0;i在那个例子中,
这个
并不是很重要。如果不是这样,而是传递一个空对象,它也会起作用。这只是一个关于如何使用apply的例子

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

关于你的第二个问题:不,它不起作用,因为
fn
需要几个参数(每个值一个来计算平均值),而执行
返回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)

对于这个用例,它没有。但是考虑以下:

var foo = {
  bar: 3
};

var addBar = function(a, b) { return a + b + this.bar };
foo.add3AndBar = spiceUp(addBar, 3);
foo.add3AndBar(1); // 7

使用<代码>应用意味着您的<代码> SPICEUP 函数可以应用于方法和普通函数。对于更可能的示例,在定义原型上的方法时考虑部分应用:

const ENV = "linux";
DoesSomePlatformSpecificStuff.prototype.getPath = spiceUp(ENV);
apply
还将把收集的参数数组发回位置参数,也可以这样做:

return fn(...n.concat(m));
可以简化为

return fn(...n, ...m);
这相当于

return fn.apply(undefined, n.concat(m));

只需返回fn(n.concat(m));
如何应用转换n.concat(m)要成为一组值而不是一个数组?@YoussefMohamed它就是这么做的。
apply
是一个内置函数,它可以做平台能够做的任何事情。我不知道在不依赖底层运行时的情况下实现这一行为的方法。你可能会问为什么
var foo=3
将值3绑定到名称“foo”上你可以重复使用它。就JavaScript而言,它的魔力。