谁能在下面的示例中解释此用法?

时间:2018-06-19 16:44:05

标签: javascript function

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

   return tot/n.length;
};

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

var doAvg = spice(avg, 1,2,3);
console.log(doAvg(4,5,6)); // result is 3.5

我不理解第11行中对此的使用。为什么我们不能调用像fn(n.concat(m))这样的函数呢?我在这里想念一些明显的东西吗?

2 个答案:

答案 0 :(得分:0)

  

为什么我们不能调用fn(n.concat(m))之类的函数?

原因是它将传递包含数组的 one 参数。所以

spice(a, 1,2,3)(4,5,6)

将与以下相同:

a([1, 2, 3, 4, 5, 6])

但是使用apply时,数组变成了一个参数列表,因此其行为类似于:

a(1, 2, 3, 4, 5, 6)

因此,应用事物的更现代方法是:

fn(...n, ...m)

但是作者仍使用apply,因为它也需要一个 context 参数,如果当前上下文(this)被传递,而没有apply上下文将是window在这里:

const obj = {
  method: spice(function() {
    console.log(this); // correctly refers to obj
  }
};

obj.method(); 

答案 1 :(得分:0)

Function.prototype.apply 它接受一个参数数组。 如下面使用Math.max的示例所示,而不是:

    Math.min(1,2,3,4,5) // which is 1

使用“应用”可以是:

    Math.min.apply(null,[1,2,3,4,5,...])//in case the length of the list varies 

优点是,在min的示例中,如果输入的长度不固定,则将apply与输入数组而不是参数列表一起使用会更简洁。