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!');
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!');
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!');