如何将console.log作为参数传递给我的JavaScript函数?
在下面的代码中,我可以使用print来代替console.log,程序可以正常运行。不过,我想使用的console.log但我得到如何将console.log作为参数传递给我的JavaScript函数?
非法调用
在运行时
function forEach(array, action) {
for (var i=0; i<array.length; i++)
action(array[i]);
}
forEach(["blah", "bac"], console.log);
一般而言,您不能直接将方法传递给Javascript中的回调函数。的this
势必在函数调用点,这取决于什么样的形式,你调用它,并且没有自动绑定的方法上(如存在,例如,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
(或类似的功能,从你选择的图书馆,因为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中的实际函数(它是一个邪恶的主机对象),因此您无法在该浏览器上对其使用绑定,应用和调用方法,因此唯一的解决方法是回退到以匿名函数包装调用
doSomething(function(x){
return console.log(x);
});
由于包装控制台。登录匿名函数是漫长的,讨厌的类型我通常添加的时候我正在开发以下全局函数和调试:
function log(message){ return function(x){
return console.log(message, x);
};};
forEach(['asd', 'zxc'], log('->'));
从这里:Create shortcut to console.log() in Chrome
您可以console.log.bind(console)
console.log
解释感谢@朱利安-d:
因为
console.log
将在内部参考this
,并预计其 是console
。如果您“分离”了log
方法,例如如var log = console.log
,此关联丢失,并且这将不再指向console
(在这种情况下为window
而不是 - 如果您在浏览器中)。 这是.bind(obj)
的用途:它返回 内部this
保持固定为obj
的方法。
但为什么你不能'log = console.log'呢? – meze 2012-01-29 10:20:17
@meze:因为'console.log'将内部引用到'this'并且期望它是'console'。如果'分离''log'方法,例如就像'var log = console.log'一样,这个关联会丢失,'this'将不再指向'console'(在本例中为'window'而不是 - 如果你在浏览器中)。这就是'.bind(obj)'的用途:它返回一个方法,在这个方法中'this'保持固定为'obj'。 – 2012-01-29 11:24:25
请记住,“绑定”在所有浏览器中都不可用。请参阅@frm的答案,了解不需要“绑定”的解决方案。 – 2012-01-29 15:50:33
可以使用作为forEach()
和console.log()
forEach(["blah", "bac"], function (element) {
console.log(element);
});
之间的桥梁匿名函数你forEach()
仍不可知有关处理程序,你不必与bind()
兼顾传递一个解决问题工作参考console.log()
。
如果你只传递了'console'和调用'log'内它将工作forEach功能。 – 2016-01-22 13:31:35