2012-01-18 27 views
36

Estoy creando una función lambda que ejecuta una segunda función con un params concreto. Este código funciona en Firefox pero no en Chrome, su inspector muestra un extraño error, Uncaught TypeError: Illegal invocation. ¿Qué pasa con mi código?TypeError no capturado: invocación ilegal en javascript

var make = function(callback,params){ 
    callback(params); 
} 

make(console.log,'it will be accepted!'); 
+1

si reemplazo '' console.log' con console.log.bind (consola) ', funciona en Chrome 12. –

+2

@ DanD-que indica que * * log espera ser llamada como un método de * console *, es decir, su palabra clave * this * debe hacer referencia al objeto * console *. – RobG

+0

su función 'make' es equivalente a' callback.call (null, params) ' –

Respuesta

63

función de registro de la consola espera this para referirse a la consola (internamente). Considere el código que reproduce el problema:

var x = {}; 
x.func = function(){ 
    if(this !== x){ 
     throw new TypeError('Illegal invocation'); 
    } 
    console.log('Hi!'); 
}; 
// Works! 
x.func(); 

var y = x.func; 

// Throws error 
y(); 

Aquí está un ejemplo (tonto) que va a trabajar, ya que se une this a console en su función de marca:

var make = function(callback,params){ 
    callback.call(console, params); 
} 

make(console.log,'it will be accepted!'); 

Esto también funciona

var make = function(callback,params){ 
    callback(params); 
} 

make(console.log.bind(console),'it will be accepted!'); 
+0

Explicación clara –

4

Puede envolver la función que necesita 'esto' para una nueva función lambda, y luego usarla para su función de devolución de llamada.

function make(callback, params) { 
    callback(params); 
} 

make(function(str){ console.log(str); }, 'it will be accepted!'); 
Cuestiones relacionadas