javascript - Why doesn't console.log work when passed as a parameter to forEach? -
this out of curiosity, of have idea why code won't work?
[1, 2, 3, 4, 5].foreach(console.log); // prints 'uncaught typeerror: illegal invocation' in chrome
on other hand, seems work fine:
[1, 2, 3, 4, 5].foreach(function(n) { console.log(n) });
so... ?
it's worth pointing out there difference in behavior in implementation of console.log
. under node v0.10.19 not error; see this:
> [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 ]
this because callback foreach
three-parameter function taking value, index, , array itself. function console.log
sees 3 parameters , dutifully logs them.
under chrome browser console, however, get
> [1,2,3,4,5].foreach(console.log); typeerror: illegal invocation
and in case, bind
will work:
> [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 ]
but there alternative way: note second parameter foreach
takes value of this
use in callback:
> [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 ]
which works in chrome console , node me. of course, i'm sure want values, i'm afraid best solution is, indeed:
> [1,2,3,4,5].foreach(function (e) {console.log(e)}); 1 2 3 4 5
whether node's behavior bug, or takes advantage of fact console.log
not specified ecma interesting in own right. varying behavior, , fact have aware of whether callback uses this
important , means have fall direct coding, if verbose keyword function
.
Comments
Post a Comment