TypeError: незаконный вызов с помощью функции JavaScript forEach в Chrome?

Я пишу функцию JavaScript высшего порядка forEach, которая буквально применяет action, когда мы перебираем каждый элемент в массиве:

function forEach(array, action) {
    for (var i = 0; i < array.length; i++)
        action(array[i]);
}

Когда я вызываю forEach с действием console.log для распечатки элементов массива, возвращается TypeError: Illegal invocation:

forEach(["Henry", "Juliane","Robert"], console.log); 
// TypeError: Illegal invocation

Озадаченный, я попытался создать функцию print, которая делает то же самое, что и console.log:

var print = function(value) {
    console.log(value);
};

Теперь, когда я вызываю forEach в том же массиве с функцией print, я получаю правильные ответы.

forEach(["Henry", "Juliane","Robert"], print); 
// "Henry"
// "Juliane"
// "Robert" 

Почему мое первое обращение было незаконным? Это потому, что я использую JS-консоль Chrome? Синтаксис выглядит нормально, здесь print и console.log делают то же самое.


person Henry    schedule 24.02.2015    source источник
comment
this внутри console.log должен указывать на console.   -  person Felix Kling    schedule 24.02.2015
comment
Вероятно, это как-то связано с тем, как обрабатываются аргументы ... Функция работает нормально, но я не уверен, что ввод console.log будет законным.   -  person boxspah    schedule 24.02.2015
comment
Более простой пример воспроизведения проблемы: var log = console.log; log(42);.   -  person Felix Kling    schedule 24.02.2015
comment
Ясно спасибо. Это был пример, использованный в Eloquent JavaScript (глава 5 о функциях высшего порядка: eloquentjavascript.net//05_higher_order.html). Встроенный код forEach, который идентичен этому, выполняется нормально.   -  person Henry    schedule 24.02.2015