32 votes

console.log () appelé sur un objet autre que la console

Je me souviens que quand j'ai voulu passer console.log rappel paramètre à une fonction, il n'a pas de travail, sauf si j'ai utilisé l' bind() méthode pour lier console pour elle.

Par exemple:

const callWithTest = callback => callback('test');
callWithTest(console.log); // That didn't use to work.
callWithTest(console.log.bind(console)); // That worked (and works) fine.

Voir Uncaught TypeError: Illégal invocation en javascript.

Toutefois, récemment, j'ai remarqué qu' console.log() fonctionne très bien, même lorsqu'elle est appelée sur un objet autre que de la console. Par exemple:

console.log.call(null, 'test');

les journaux d' 'test'.

Quand et pourquoi avez-vous changé? La spécification rien dire à ce sujet?

13voto

Gothdo Points 4842

L'éditeur du Projet de Console API utilisé pour dire:

La journalisation de l'Api DOIVENT tous être appelées à des fonctions leur permettant d'être passés comme arguments à la gestion des erreurs rappels, forEach, méthodes, etc.

Ce n'est plus incluse dans la version actuelle de la norme.

Je pensais que Chrome et Node.js changé pour le travail comme dans la spécification, mais il semble que ça fonctionnait comme ça, même avant elle.

Je suis toujours curieux quand avez-vous changé et quelle était la raison de cela.

0voto

Hin Fan Chan Points 778

Je ne sais pas quand le changement a été fait, mais j'ai une idée de pourquoi ça ne fonctionne pas.

Considérons le code suivant

callWithTest = callback => callback('test');
var Demo = function () {this.str = 'demo';}
Demo.prototype.getStr = function () { return this.str;}
demo = new Demo ();
demo.getStr(); // returns 'demo'
callWithTest(demo.getStr); // returns undefined
window.str = 'window';
callWithTest(demo.getStr); // returns 'window'

Si vous trace le code, vous verrez que lors de la démo.getStr est appelée par une autre fonction, this désigne window, et le sine - str n'est pas défini dans window, il retourne undefined. Si vous l'avez appelé directement ou de se lier avec la démo, this se réfère à la démo et donc il retourne "démo".

En nodeJS (v6.6.0), il existe une classe appelée Console à l'intérieur de la console module explicitement par l'utilisateur tuyau de journaux dans un fichier (ou tout ce flux d'un utilisateur). Selon Node.js v6.6.0 spécification de l'api,

console = new Console(process.stdout, process.stderr);

Console n'existe pas dans le navigateur comme il n'est pas nécessaire. La sortie de la console n'existe que dans une toile utilisée pour le débogage, et il y a exactement une instance de celle-ci. L'utilisateur ne peut pas et ne doit pas être en mesure de, tuyau de sortie de la console pour tous les autres lieux qu'il va devenir un grave problème de sécurité. En raison de cela, les développeurs peuvent faire quelque chose au sein de la fonction log comme var x = this.x || console.x comme il y a exactement une instance de l'objet console.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X