Стоит отметить, что в реализации console.log
есть разница в поведении.Под узлом v0.10.19 вы не получите ошибку;Вы просто видите это:
> [1,2,3,4,5].forEach(console.log);
1 0 [ 1, 2, 3, 4, 5 ]
2 1 [ 1, 2, 3, 4, 5 ]
3 2 [ 1, 2, 3, 4, 5 ]
4 3 [ 1, 2, 3, 4, 5 ]
5 4 [ 1, 2, 3, 4, 5 ]
Это потому, что обратный вызов forEach
является трехпараметрической функцией, которая принимает значение, индекс и сам массив.Функция console.log
видит эти три параметра и покорно регистрирует их.
Однако в консоли браузера Chrome вы получаете
> [1,2,3,4,5].forEach(console.log);
TypeError: Illegal invocation
, а в этом случае bind
будет работать:
> [1,2,3,4,5].forEach(console.log.bind(console));
1 0 [ 1, 2, 3, 4, 5 ]
2 1 [ 1, 2, 3, 4, 5 ]
3 2 [ 1, 2, 3, 4, 5 ]
4 3 [ 1, 2, 3, 4, 5 ]
5 4 [ 1, 2, 3, 4, 5 ]
, но есть альтернативный способ: обратите внимание, что второй параметр для forEach
принимает значение this
для использования в обратном вызове:
> [1,2,3,4,5].forEach(console.log, console)
1 0 [ 1, 2, 3, 4, 5 ]
2 1 [ 1, 2, 3, 4, 5 ]
3 2 [ 1, 2, 3, 4, 5 ]
4 3 [ 1, 2, 3, 4, 5 ]
5 4 [ 1, 2, 3, 4, 5 ]
, который работает в консоли и узле Chrome для меня.Конечно, я уверен, что вы хотите - это просто значения, поэтому я боюсь, что лучшее решение действительно таково:
> [1,2,3,4,5].forEach(function (e) {console.log(e)});
1
2
3
4
5
Является ли поведение узла ошибкой, илион просто использует тот факт, что console.log
не указан ECMA, сам по себе интересен.Но различное поведение и тот факт, что вы должны знать, использует ли ваш обратный вызов this
, важны и означают, что мы должны вернуться к прямому кодированию, даже если оно многословно благодаря ключевому слову function
.