Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Array.prototype.forEach.call выдает TypeError: недопустимый вызов

Автор вопроса: RobinОтветов: 1

Кто-нибудь может сказать мне, почему это не работает?

Array.prototype.forEach.call(document.body.children, console.log);

Я получаю следующую ошибку:

Uncaught TypeError: Недопустимый вызов (...) (анонимная функция)

Что кажется ерундой, поскольку оба работают:

Array.prototype.forEach.call(document.body.children, function () {console.log(arguments)});
Array.prototype.forEach.call(document.body.children, l=>console.log(l));

ПРИМЕЧАНИЕ: вызываемая функция (в данном случае console.log) является просто примером, первоначальное намерение состояло в том, чтобы вместо этого использовать document.body.removeChild, но это не удалось таким же образом.

ДРУГОЕ ПРИМЕЧАНИЕ. Я пробовал это только в Chrome. Я пробовал следующее в консоли node.js, и все работало нормально:

Array.prototype.forEach.call(myArray, console.log)

  • Итак, мне нужно связать document.body (или элемент DOM), я вызываю removeChild - спасибо @SergeSeredenko Robin 19.02.2016

javascriptarrayscallforeachtypeerror

Ответы

Ответ 1 · рейтинг 4 · Oriol

Это потому, что метод console.log должен вызываться для объекта console:

var log = console.log;
log(123); /* TypeError: 'log' called on an object that
             does not implement interface Console. */
log.call(console, 123); /* Works */

Вы можете исправить это, передав третий аргумент в forEach, который определяет значение this:

Array.prototype.forEach.call(document.body.children, console.log, console);

Или вы можете привязать console.log к console:

Array.prototype.forEach.call(document.body.children, console.log.bind(console));

Также предлагается оператор привязки:

Array.prototype.forEach.call(document.body.children, ::console.log);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы