Ogólnie nie można przekazywać metod bezpośrednio do wywołań zwrotnych w JavaScript.this
jest zobowiązany w momencie wywołania funkcji, w zależności od tego, co tworzą to nazwać i nie ma automatycznego wiązania metod (jak tam jest, na przykład, Python)
//does not work.
var obj = {
x: 17,
f: function(){ return this.x; }
};
//inside doSomething, f forgets its "this" should be obj
doSomething(obj.f)
W tych przypadkach, może użyć Function.prototype.bind
(lub podobną funkcję z biblioteki wyboru, ponieważ bind
nie jest obecny w IE < = 8)
//works (for normal methods - see next bit for console.log in particular)
var obj = {
x: 17,
f: function(){ return this.x; }
};
doSomething(obj.f.bind(obj))
Niestety, to nie zawsze wystarcza do console.log. Ponieważ nie jest to faktyczna funkcja w IE, (jest to obiekt będący złym hostem), nie można używać do tego celu metody powiązania, stosowania i wywoływania w tej przeglądarce, więc jedyne obejście wraca do zawijania połączenia w anonimowej funkcji
doSomething(function(x){
return console.log(x);
});
Od owijania konsoli.Zaloguj anonimowej funkcji jest długa i irytujące typu I zwykle dodać następujące globalną funkcję kiedy jestem rozwijających się i debugowanie:
function log(message){ return function(x){
return console.log(message, x);
};};
forEach(['asd', 'zxc'], log('->'));
będzie działać, jeśli przechodzą tylko 'console' i nazywają' log' wewnątrz dla całej funkcji. –