如何将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); 
+0

如果你只传递了'console'和调用'log'内它将工作forEach功能。 – 2016-01-22 13:31:35

一般而言,您不能直接将方法传递给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的方法。

+0

但为什么你不能'log = console.log'呢? – meze 2012-01-29 10:20:17

+2

@meze:因为'console.log'将内部引用到'this'并且期望它是'console'。如果'分离''log'方法,例如就像'var log = console.log'一样,这个关联会丢失,'this'将不再指向'console'(在本例中为'window'而不是 - 如果你在浏览器中)。这就是'.bind(obj)'的用途:它返回一个方法,在这个方法中'this'保持固定为'obj'。 – 2012-01-29 11:24:25

+0

请记住,“绑定”在所有浏览器中都不可用。请参阅@frm的答案,了解不需要“绑定”的解决方案。 – 2012-01-29 15:50:33

可以使用作为forEach()console.log()

forEach(["blah", "bac"], function (element) { 
    console.log(element); 
}); 

之间的桥梁匿名函数你forEach()仍不可​​知有关处理程序,你不必与bind()兼顾传递一个解决问题工作参考console.log()