具体的なparamsで2番目の関数を実行するラムダ関数を作成しています。このコードはFirefoxでは動作しますが、Chromeでは動作しません。そのインスペクターには奇妙なエラーUncaught TypeError: Illegal invocation
。私のコードの何が問題になっていますか?
var make = function(callback,params){
callback(params);
}
make(console.log,'it will be accepted!');
コンソールのログ関数は、this
が(内部的に)コンソールを参照することを想定しています。問題を再現する次のコードを検討してください。
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();
Make関数でthis
をconsole
にバインドするため、動作する(愚かな)例は次のとおりです。
var make = function(callback,params){
callback.call(console, params);
}
make(console.log,'it will be accepted!');
これも機能します
var make = function(callback,params){
callback(params);
}
make(console.log.bind(console),'it will be accepted!');
「this」を必要とする関数を新しいラムダ関数にラップして、コールバック関数に使用できます。
function make(callback, params) {
callback(params);
}
make(function(str){ console.log(str); }, 'it will be accepted!');