JavaScript: написать функцию, которая принимает объект и массив функций в качестве входных аргументов и возвращает массив - PullRequest
0 голосов
/ 02 июня 2019

Я хочу взять объект и массив функций и вернуть массив.Я пытаюсь использовать цикл 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 Ответ

2 голосов
/ 02 июня 2019

Вы возвращаетесь в каждом цикле.Таким образом, после первого цикла функция завершается, и код больше не выполняется.

Возвращает 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 к функции зависит от того, как вызывается функция.Если функция вызывается как метод объекта, тогда объект будет привязан к этому методу.

В приведенном выше коде this внутри обеих ваших функций будут refer до window объекты, если они вызываются в обычном режиме.Поэтому мы хотим, чтобы this ссылался на объект, поэтому мы используем call

Почему eachFunc (obj) возвращает [undefined, undefined]?

Когда вы неИспользование call this будет ссылаться на window объект.Таким образом, нет объекта с именем first и last для window объекта, поэтому он возвращает undefined

...