2012-01-18 15 views
36

yasadışı çağırma Bir beton params ile ikinci bir işlevi yürüten bir lambda işlevi oluşturuyorum.Bu kod, Firefox'ta çalışır, ancak Chrome'da değil, denetçisi garip bir hata, Uncaught TypeError: Illegal invocation gösterir. Kodumun nesi var?Kaçınmayan TypeError: javascript

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

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

, bu @ Krom 12. –

+2

çalışır DAND-* log * için bir yöntem olarak çağrılacak bekler belirtir * konsol *, yani * bu * anahtar kelimesinin * console * nesnesine başvurması gerekir. – RobG

+0

'make' işleviniz' callback.call (null, params) 'ile eşdeğerdir –

cevap

63

Konsolun günlük işlevi this konsola (dahili) başvurmak için beklemektedir.

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

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

Bu aynı zamanda

çalışacaktır: sizin yapmak fonksiyonunda console için this bağlandığı için,

İşte
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(); 

çalışacak bir (saçma) örnektir: sorununuzu kopyalayan bu kodu düşünün

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

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

Açıklayıcı açıklama –

4

'Bu' gerektiren bir işlevi yeni bir lambda işlevine sarın ve sonra geri arama işleviniz için kullanabilirsiniz. i console.log.bind 'ile' (konsol) 'console.log` yerine eğer

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

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