Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将console.log作为参数传递给JavaScript函数?_Javascript - Fatal编程技术网

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

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

在下面的代码中,我可以使用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;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('->'));