Uncaught TypeError: Ilegal invocación en javascript

Estoy creando una función lambda que se ejecuta una segunda función de hormigón params.Este código funciona en Firefox pero no en Chrome, su inspector muestra un error extraño, Uncaught TypeError: Illegal invocation. Lo malo de mi código?

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

make(console.log,'it will be accepted!');
  • si puedo reemplazar console.log con console.log.bind(console), funciona en Chrome 12.
  • indica que el registro de espera para ser llamado como un método de consola, es decir, que sus esta palabra clave debe hacer referencia al objeto console.
  • su make función es equivalente a callback.call(null,params)
  • Me gustaría señalar que en versiones antiguas de IE de la consola.el registro puede ser invocable host-objeto (sin llamada, o aplicar los métodos de enlace), en lugar de ser una función.
InformationsquelleAutor fcortes | 2012-01-18

2 Kommentare

  1. 63

    La consola de registro de la función espera this para referirse a la consola (internamente). Considere la posibilidad de este código, que replica su 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í es un (tonto) ejemplo de que va a trabajar, ya que se une this a console en su función:

    var make = function(callback,params){
        callback.call(console, params);
    }
    
    make(console.log,'it will be accepted!');

    Esto también funcionará

    var make = function(callback,params){
        callback(params);
    }
    
    make(console.log.bind(console),'it will be accepted!');
    • Explicación clara
  2. 4

    Usted puede ajustar la función de la que necesita ‘este’ a una nueva función lambda, y, a continuación, utilizar para la función de devolución de llamada.

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea