Это просто из любопытства, но у любого из вас есть идея, почему этот код не будет работать?
Ответ 2
Стоит отметить, что существует разница в поведении при реализации console.log
. В node 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 и node для меня. Конечно, я уверен, что вы хотите только значения, поэтому я боюсь, что лучшее решение действительно:
> [1,2,3,4,5].forEach(function (e) {console.log(e)});
1
2
3
4
5
Является ли поведение node ошибкой или просто использует тот факт, что console.log
не указывается ECMA, является интересным в своем собственном праве. Но различное поведение и тот факт, что вы должны знать, использует ли ваш обратный вызов this
, и означает, что мы должны вернуться к прямому кодированию, даже если он является подробным благодаря ключевому слову function
.