JavaScript:写函数,将一个对象和一个函数数组作为输入args并返回一个数组

时间:2019-06-02 15:19:12

标签: javascript arrays function object call

我想要一个对象和一个函数数组并返回一个数组。我正在尝试在这里使用for循环。

我在下面有以下代码:

const fnArr = [
      function firstName() {
        return this.first;
      },

      function lastName() {
        return this.last;
      },
    ];

const obj = { first: 'Nimit', last: 'Maru' };

function callAll(obj, fnArr){

  let newArray = [];

  for (let i=0; i<fnArr.length; i++){
    let eachFunc = fnArr[i]; 

    return newArray.push(eachFunc.call(obj))
  }
}

callAll(obj, fnArr)

我的预期输出是:

['Nimit', 'Maru']

但是我个人代码的输出返回:1

问题1:我在这里做错了什么?

///////////////////////////////////////////////// ///////////////////////////////////////////////////// //////////

另外,给我的解决方案如下:

const fnArr = [
          function firstName() {
            return this.first;
          },

          function lastName() {
            return this.last;
          },
        ];


const obj = { first: 'Nimit', last: 'Maru' };


const callAll = (obj, fnArr) => {
  return fnArr.map(fn => {
    return fn.call(obj);
  });
};

它会产生正确的答案。

问题2:在上面的解决方案代码中,为什么在“ return fn.call(obj)”中需要调用方法?

在这种情况下何时需要或不需要呼叫的概念性解释将不胜感激。

1 个答案:

答案 0 :(得分:2)

您将在每个循环中返回。因此,在第一个循环之后,该函数结束并且代码不再执行。

它返回1,因为push()方法在向数组添加元素后返回了数组的长度。最初添加1个元素后,数组为空,它将返回1

您不必仅使用map()元素(不返回)即可使用push()。并在循环后返回newArray

const fnArr = [
      function firstName() {
        return this.first;
      },

      function lastName() {
        return this.last;
      },
    ];

const obj = { first: 'Nimit', last: 'Maru' };

function callAll(obj, fnArr){

  let newArray = [];

  for (let i=0; i<fnArr.length; i++){
    let eachFunc = fnArr[i]; 

    newArray.push(eachFunc.call(obj))
  }
  return newArray
}


console.log(callAll(obj, fnArr))

  

在上面的解决方案代码中,为什么在“ return fn.call(obj)”中需要调用方法?

此对函数的绑定取决于函数的调用方式。如果将该函数称为对象的方法,则该对象将绑定到该方法。

在上面的代码this中,如果两个函数正常调用,则两个函数将referwindow对象。所以我们希望this引用对象,所以我们使用call

  

为什么eachFunc(obj)返回[undefined,undefined]?

当您不使用call时,this将引用window对象。因此,first对象上没有名为lastwindow的属性,因此它返回undefined