如何将console.log作为参数传递给JavaScript函数?
在下面的代码中,我可以使用print代替console.log,程序可以正确运行。然而,我希望使用console.log,但我得到 非法调用 运行时如何将console.log作为参数传递给JavaScript函数?,javascript,Javascript,在下面的代码中,我可以使用print代替console.log,程序可以正确运行。然而,我希望使用console.log,但我得到 非法调用 运行时 function forEach(array, action) { for (var i=0; i<array.length; i++) action(array[i]); } forEach(["blah", "bac"], console.log); 函数forEach(数组、动作){ 对于(var i=0;
function forEach(array, action) {
for (var i=0; i<array.length; i++)
action(array[i]);
}
forEach(["blah", "bac"], console.log);
函数forEach(数组、动作){
对于(var i=0;i从这里开始:
您可以将console.log
替换为console.log.bind(console)
感谢@julian-d:
因为console.log
将在内部引用此并期望它
要成为控制台
。如果您“分离”日志
方法,如var日志=
console.log
,此关联将丢失,并且不再指向
控制台
(在本例中,如果您在浏览器中,请转到窗口
)。
这就是.bind(obj)
的目的:它返回一个方法,其中
内部此
保持固定到obj
您可以使用一个匿名函数作为forEach()
和console.log()
您的forEach()
通常,您不能在Javascript中将方法直接传递给回调。此在函数调用点绑定,具体取决于您调用它的形式,并且没有方法的自动绑定(例如,Python中)
在这些情况下,可以使用Function.prototype.bind
(或者您选择的库中的类似函数,因为IE中不存在bind
,但是为什么您不能执行log=console.log
呢?@meze:因为console.log
将在内部引用此
,并期望它是控制台
。如果您“分离”log
方法,例如varlog=console.log
,此关联将丢失,此
将不再指向控制台
(在本例中,如果您在浏览器中,则指向窗口
)。这是绑定(obj)的目的
:它返回一个方法,在该方法中,此
在内部固定为obj
。请记住,bind
并非在所有浏览器中都可用。请参阅@frm的答案,以获得一个不需要bind
的解决方案。这在IE上不起作用(至少在旧的浏览器上不起作用)-console.log不是一个函数,因此它缺少bbind调用,如果只在forEach函数中传递控制台
和调用日志
,则applyIt将起作用。
forEach(["blah", "bac"], function (element) {
console.log(element);
});
//does not work.
var obj = {
x: 17,
f: function(){ return this.x; }
};
//inside doSomething, f forgets its "this" should be obj
doSomething( obj.f )
//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) )
doSomething( function(x){
return console.log(x);
});
function log(message){ return function(x){
return console.log(message, x);
};};
forEach(['asd', 'zxc'], log('->'));