在下面的代码中,我可以使用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('->'));
原文地址:https://www.jb51.cc/js/156445.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。