49 votes

Pourquoi ne console.journal.appliquer() lève une Illégales Invocation d'erreur?

Lorsque j'exécute le code suivant dans Chrome 18 bêta j'obtiens l'erreur:

console.log.apply(this, ['message']);

TypeError: Illégal invocation.

Dans Firefox 10, il fonctionne comme prévu.

Dans IE9 j'obtiens l'erreur: Object doesn't support property or method 'apply'.

Je devine que cela a à voir avec la façon dont le navigateur a mis en oeuvre console.log.

Pourquoi ça marche sous Firefox mais pas sur Chrome et IE? J'espère que quelqu'un peut jeter quelque lumière sur la cause de cette situation et de ses ramifications.

Voici un exécutable de l'échantillon sur JS Bin.

105voto

squint Points 28293

console et log sont des objets hôte. Leur comportement est dépendant de l'implémentation, et dans une large mesure, ne sont pas tenus de mettre en œuvre la sémantique d'ECMAScript.

FWIW, votre jsBin échoue dans Chrome ainsi, à moins que vous la changez pour...

console.log.apply(console, ['message']);

mais cela semble être qu' log simplement prévoit un contexte d'appel console.

11voto

jimmont Points 317

Voici une solution alternative. Je ne suis pas sûr que le cas où il n'y a pas d'argument fonctionne comme prévu.

function logr(){
    var i = -1, l = arguments.length, args = [], fn = 'console.log(args)';
    while(++i<l){
        args.push('args['+i+']');
    };
    fn = new Function('args',fn.replace(/args/,args.join(',')));
    fn(arguments);
};
logr(1,2,3);
logr();
logr({},this,'done')

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