web-dev-qa-db-fra.com

TypeError non intercepté: invocation illégale en javascript

Je crée une fonction lambda qui exécute une deuxième fonction avec des paramètres concrets. Ce code fonctionne dans Firefox mais pas dans Chrome, son inspecteur montre une erreur étrange, Uncaught TypeError: Illegal invocation. Quel est le problème de mon code?

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

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

La fonction de journal de la console s'attend à ce que this fasse référence à la console (en interne). Considérez ce code qui reproduit votre problème:

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();

Voici un exemple (idiot) qui fonctionnera, car il lie this à console dans votre fonction make:

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

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

Cela fonctionnera également

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

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

Vous pouvez encapsuler la fonction qui a besoin de "ceci" dans une nouvelle fonction lambda, puis l'utiliser pour votre fonction de rappel.

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

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