Путаница в методе .apply () в JavaScript

Я новичок в JavaScript и только учился использовать .call () и apply (). До сих пор я узнал, что .apply () ожидает массив после указания ему ссылки «this». Итак, играя с некоторым кодом, я столкнулся с этой небольшой проблемой, когда .call () работает, а .apply () не работает, хотя я передаю ему массив. Не могли бы вы объяснить мне проблему. Спасибо

let obj = {
  arr: [2, 3, 4, 5],
  add: function(array) {
    return array.reduce((a, b) => a + b);
  },
  multiply: function(array) {
    return array.reduce((a, b) => a * b);
  }
}

let answer = function(op, arr) {
  if (op == "add") {
    console.info(this.add(arr));
  } else if (op == "multiply") {
    console.info(this.multiply(arr));
  }
}.apply(obj, "multiply", obj.arr);
//Uncaught TypeError: CreateListFromArrayLike called on non-object at main.js:17

Второй аргумент apply должен быть массивом. 'multiply' - это строка, а не массив.

CertainPerformance 01.01.2019 12:57

Это хороший вопрос - я не могу сразу понять, что с ним не так.

dwjohnston 01.01.2019 13:02

Итак, все аргументы после установки "this" должны быть массивами или он принимает только два аргумента, включая установку "this"?

Ofentse Prosper Nglazi 01.01.2019 13:03

Опять же, я знаю, что мой вопрос отмечен как повторяющийся, но вопрос, на который вы мне указываете, очень сложный, поэтому, пожалуйста, подумайте еще раз, спасибо

Ofentse Prosper Nglazi 01.01.2019 13:13

Только то, что повторяющаяся цель - сложный, не делает ее недублирующей. Важной частью цели дублирования является последний блок кода (где path является строкой, а не массивом). Проблема та же, решение (как показано Джонасом в своем ответе здесь) то же самое.

Andreas 01.01.2019 13:18

Хорошо, спасибо @Andreas, в следующий раз буду задавать вопросы получше

Ofentse Prosper Nglazi 01.01.2019 13:27
"... в следующий раз задам вопросы получше" - Я ничего не сказал о качестве вашего вопроса O.o
Andreas 01.01.2019 13:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
804
1

Ответы 1

Apply ожидает массив аргументов, просто оберните аргументы в массив:

 .apply(obj, ["multiply", obj.arr])

Function.prototype.apply(thisArg, [argsArray])

The apply() method calls a function with a given this value, and arguments provided as an array (or an array-like object).


Parameters

  • thisArg
    Optional. The value of this provided for the call to func. Note that this may not be the actual value seen by the method: if the method is a function in non-strict mode code, null and undefined will be replaced with the global object, and primitive values will be boxed.
  • argsArray
    Optional. An array-like object, specifying the arguments with which func should be called, or null or undefined if no arguments should be provided to the function. Starting with ECMAScript 5 these arguments can be a generic array-like object instead of an array. See below for browser compatibility information. Return valueSection The result of calling the function with the specified this value and arguments.

Return value

The result of calling the function with the specified this value and arguments.

Это не особо полезно.

dwjohnston 01.01.2019 13:05

@dwjohnston не стесняйтесь редактировать эту вики сообщества или проголосовать за повторное открытие

Jonas Wilms 01.01.2019 13:07

Итак, все аргументы после установки "this" должны быть массивами или он принимает только два аргумента, включая установку "this"? @Jonas

Ofentse Prosper Nglazi 01.01.2019 13:16

@ofentse второй, он принимает только два аргумента.

Jonas Wilms 01.01.2019 13:18

Ну ладно, думаю, я подумал, что когда они говорят, что принимает массивы, это означает, что последний аргумент должен быть массивом. Я продолжаю изучать это, очень признателен

Ofentse Prosper Nglazi 01.01.2019 13:22

Другие вопросы по теме