web-dev-qa-db-fra.com

Pourquoi console.log.apply () renvoie une erreur d'invocation illégale?

Lorsque j'exécute le code suivant dans Chrome 18 beta, j'obtiens l'erreur:

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

TypeError: invocation illégale.

Dans Firefox 10, cela fonctionne comme prévu.

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

Je suppose que cela a à voir avec la façon dont le navigateur a mis en œuvre console.log.

Pourquoi cela fonctionne-t-il dans Firefox mais pas dans Chrome et IE? J'espère que quelqu'un pourra faire la lumière sur la cause de cela et ses ramifications.

Voici n exemple exécutable sur JS Bin.

49
joshuapoehls

console et log sont des objets Host. Leur comportement dépend de l'implémentation et, dans une large mesure, ils ne sont pas requis pour implémenter la sémantique d'ECMAScript.

FWIW, votre jsBin échoue également dans Chrome sauf si vous le changez en ...

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

mais cela semble être que log anticipe simplement un contexte d'appel de console.

105
user1106925

Voici une solution alternative. Je ne suis pas sûr que le cas où il n'y a pas d'arguments 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')
11
jimmont