2012-03-01 11 views
49

Cuando ejecuto el siguiente código en Chrome 18 beta me sale el error:¿Por qué console.log.apply() arroja un error de Invocación ilegal?

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

TypeError: Illegal invocation.

En Firefox 10 funciona como se esperaba.

En IE9 aparece el error: Object doesn't support property or method 'apply'.

Supongo que esto tiene que ver con la forma en que el navegador ha implementado console.log.

¿Por qué funciona en Firefox pero no en Chrome e Internet Explorer? Espero que alguien pueda arrojar algo de luz sobre la causa de esto y sus ramificaciones.

Aquí está an executable sample en JS Bin.

Respuesta

104

console y log son objetos host. Su comportamiento depende de la implementación, y en gran medida no son necesarios para implementar la semántica de ECMAScript.

Fwiw, su jsBin falla en Chrome, así, a menos que se cambie a ...

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

pero que parece ser que simplemente log anticipa un contexto de llamada de console.

11

Aquí hay una solución alternativa. No estoy seguro de que el caso donde no hay args funciona como se esperaba.

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') 
+2

Esto es brillante, gracias! – kralyk

+0

¿por qué todo este código cuando simplemente tiene que pasar la consola como esto? –

+2

aplicar ha estado allí durante más de 20 años –

Cuestiones relacionadas