Warum nicht Konsole.melden Sie die Arbeit, wenn als parameter übergeben forEach?
Dies ist nur aus Neugier, aber haben Sie eine Idee, warum dieser code nicht funktioniert?
[1, 2, 3, 4, 5].forEach(console.log);
//Prints 'Uncaught TypeError: Illegal invocation' in Chrome
Auf der anderen Seite, scheint dies gut zu funktionieren:
[1, 2, 3, 4, 5].forEach(function(n) { console.log(n) });
So... ?
- Sie haben den falschen
this
. - In der Tat. Beantworten Sie mich, ich bin so ein idiot
- Kann es einfach gelöscht werden? Es ist nicht wirklich hilfreich =/
- Ich meinte die Frage, aber ich denke, jemand mochte es genug, um upvote so ist es vielleicht nützlich war jemand, nachdem alle... Es ist nie für mich klar, wenn upvotes sind von Menschen finden, die Frage ist wirklich nützlich, oder einfach nur aus Beantworter versuchen zu Spiel das system.
- In Ordnung mit mir, aber Sie denken, dass ist wirklich notwendig? es wurden 2 upvotes... vielleicht können wir ihn schließen, als ein Duplikat von Frage, dass die Gespräche über
bind
in js? - Es wäre wahrscheinlich am besten in der Nähe, wie ein dupe der Frage, wie man
this
ist geklärt... es gibt andere Wege alsbind
zu umgehen. - Warum schliessen? Dies ist ein wirklich Interessantes Rätsel. In der Tat, ich bin immer noch versuchen, wickeln Sie meinen Kopf herum.
- Vergleichen Sie die Ausgabe dieser in der chrome console:
[1,2,3,4,5].forEach(console.log.bind(console));
...[1,2,3,4,5].forEach(function(x){console.log(x)});
- ja, vielleicht bin ich falsch. Es könnte ein Fall ungewöhnlich genug, dass es schwer zu sagen, was passiert in der ersten.
- yep, das ist eine gute Frage. @PabloFernandez - ich nehme an, du hast die inspiration für diese Frage nach der Lektüre von "Async Javascript" Buch von Trevor Burnham - Seite 13 - genau das gleiche Beispiel-code 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist erwähnenswert,, dass es einen Unterschied im Verhalten bei der Umsetzung der
console.log
. Unter dem Knoten v0.10.19 Sie erhalten keine Fehler, Sie sehen einfach dies:Dies ist, weil der Rückruf
forEach
ist eine drei-parameter-Funktion unter dem Wert, der index, und das array selbst. Die Funktionconsole.log
sieht diese drei Parameter und brav protokolliert.Unter dem Chrome-browser-Konsole, jedoch bekommen Sie
in diesem Fall
bind
wird Arbeit:aber gibt es einen alternativen Weg: beachten Sie, dass die zweiten parameter
forEach
nimmt den Wert vonthis
zu verwenden, in der Rückruf:welche in der Chrome Konsole und Knoten für mich. Natürlich, ich bin mir sicher, dass das, was Sie wollen nur die Werte, so fürchte ich, die beste Lösung ist, in der Tat:
Ob Knoten ist das Verhalten ein bug ist, oder man nimmt sich einfach die Tatsache zunutze, dass
console.log
ist nicht angegeben, die von der ECMA ist interessant in seinem eigenen Recht. Aber das unterschiedliche Verhalten, und die Tatsache, dass Sie müssen sich bewusst sein, ob Ihre callback verwendetthis
ist wichtig und bedeutet, müssen wir zurückgreifen, um direkt Programmieren, auch wenn es ausführlich durch das Schlüsselwortfunction
.[1,2,3].forEach(v=>console.log(v))
. 😉forEach
(und Freunde) in der frühen 2014. Muss umgeschaltet, kurz, nachdem, obwohl.Dies funktioniert:
console.log
auf die drei Parameter der callback-und druckt sehr chaotisch und unerwünschten Ausgang. Es war wahrscheinlich die Arbeit zurück, als die Antwort geschrieben wurde, aber, aber nur, weil die JavaScript-Implementierung war falsch, IMHO. Der Rückruf dauert drei Parameter in diesen Tagen.Tatsächlich, wie @SLaks darauf hingewiesen, Konsole.log scheint mit
this
intern und wenn es als parameter übergebenthis
bezieht sich jetzt auf die array-Instanz.Die Abhilfe ist einfach:
var c = console.log.bind(console);
[1,2,3,4,5].forEach(c);
Kann ich nicht sagen, ich habe gesehen, dass der syntax, aber meine Vermutung ist, weil Protokoll einen parameter erwartet, als die Nachricht/Objekt/etc anmelden, in der Konsole.
im ersten Beispiel, Sie sind nur auf der Durchreise eine Funktionsreferenz zu forEach, das ist in Ordnung, wenn Ihre Funktion nicht erwarten, dass Parameter, die die Funktion verhält sich wie erwartet. Im zweiten Beispiel übergeben Sie in e und dann melden Sie es.
forEach
ist ein parameter übergeben wird.