2012-01-18 13 views
36

具体的なparamsで2番目の関数を実行するラムダ関数を作成しています。このコードはFirefoxでは動作しますが、Chromeでは動作せず、その検査官は奇妙なエラーUncaught TypeError: Illegal invocationを示します。私のコードの何が間違っていますか?Uncaught TypeError:javascriptでの不正な呼び出し

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

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

私は 'console.log.bind(コンソール)'と 'console.log'を交換する場合、それはdおよび、*ログ*はの方法として呼ばれることを期待していることを示し@クローム12 –

+2

で動作します* console *、つまり* this *キーワードは* console *オブジェクトを参照しなければならないということです。 – RobG

+0

あなたの 'make'関数は' callback.call(null、params) 'と同等です –

答えて

63

コンソールのログ機能がthisは、コンソール(内部)を参照することを期待します。

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

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

これも

に動作します:それはあなたのメイク機能で consolethisを結合するので、

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

が動作します(愚かな)の例である:あなたの問題を複製し、このコードを考えてみましょう

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

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

明確な説明 –

4

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

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

make(function(str){ console.log(str); }, 'it will be accepted!'); 
関連する問題