web-dev-qa-db-ja.com

Uncaught TypeError:javascriptでの不正な呼び出し

具体的なparamsで2番目の関数を実行するラムダ関数を作成しています。このコードはFirefoxでは動作しますが、Chromeでは動作しません。そのインスペクターには奇妙なエラーUncaught TypeError: Illegal invocation。私のコードの何が問題になっていますか?

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

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

コンソールのログ関数は、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関数でthisconsoleにバインドするため、動作する(愚かな)例は次のとおりです。

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

「this」を必要とする関数を新しいラムダ関数にラップして、コールバック関数に使用できます。

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

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