Hacker News new | ask | show | jobs
by chingjun 4196 days ago
Can anyone explain to me why I couldn't write

  n.forEach(console.log);

Just tested on Chrome, it gives me an error

  TypeError: Illegal invocation
2 comments

When you use `console.log` that way it gets `this` set to `null`. When you call `console.log("hello")`, `this` is set to `console`. Your code would work if you set an explicit `this`.

    n.forEach(console.log.bind(console));
I don't think there's any reason for this library to exist after you understand `this` semantics but I may be missing something.

e: was, in fact, missing something. Apologies for the disparaging comment, see replies.

Additionally, this will log all the passed arguments (value, index, and array being traversed), which typically isn't what you want:

    [1, 2, 3].forEach(console.log.bind(console));
    > 1 0 [1, 2, 3]
    > 2 1 [1, 2, 3]
    > 3 2 [1, 2, 3]
Well it's not just about `this` but the arguments to pass to console rather. In this case:

    n.forEach(console.log.bind(console));
forEach is passing console all of its callback arguments, resulting in logging of keys, values, and array.

EDIT: Forgot array

Ah, I understand. It reminds me of how the `cut` function could be used in Scheme.
Convenience, I suppose; I had a few headaches when I first transitioned to Javascript and discovered the odd signatures its collection functions' callbacks are expected to have.
That's one, the other is that many of those functional methods tend to mess with functions that take more than one argument when you want to use the first one, e.g parseInt.

  n.forEach(console.log);
Works on firefox. Chrome treats console.log differently from other functions for reasons unknown.

but really, this library has no reason to exist