微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将console.log作为参数传递给我的JavaScript函数?

在下面的代码中,我可以使用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 举报,一经查实,本站将立刻删除。

相关推荐