在下面的代码中,我可以使用print代替console.log,程序可以正常运行.但是我希望使用console.log但是我得到了
Illegal invocation
在运行时
function forEach(array,action) { for (var i=0; i<array.length; i++) action(array[i]); } forEach(["blah","bac"],console.log);
解决方法
通常,您无法将方法直接传递给Javascript中的回调.这是在函数调用的点上绑定的,这取决于你调用它的形式,并且没有方法的自动绑定(比如,例如,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 )
在这些情况下,可以使用Function.prototype.bind(或您选择的库中的类似函数,因为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) )
不幸的是,对于console.log来说,这并不总是足够的.由于它不是IE中的实际函数(它是一个邪恶的宿主对象),你不能在该浏览器上使用bind,apply和call方法,因此唯一的解决方法是回退到将函数包装在匿名函数中
doSomething( function(x){ return console.log(x); });
由于在匿名函数中包装console.log很长并且对于类型I很烦人,因此在我开发和调试时通常会添加以下全局函数:
function log(message){ return function(x){ return console.log(message,x); };}; forEach(['asd','zxc'],log('->'));