未捕获类型错误:javascript中的非法调用

未捕获类型错误:javascript中的非法调用,javascript,lambda,functional-programming,invocation,Javascript,Lambda,Functional Programming,Invocation,我正在创建一个lambda函数,它执行第二个带有具体参数的函数。这段代码在Firefox中有效,但在Chrome中不起作用,它的检查器显示了一个奇怪的错误,uncaughttypeerror:非法调用。我的代码怎么了 var make = function(callback,params){ callback(params); } make(console.log,'it will be accepted!'); 控制台的日志功能期望此引用控制台(内部)。考虑一下复制你的问题的代码:

我正在创建一个lambda函数,它执行第二个带有具体参数的函数。这段代码在Firefox中有效,但在Chrome中不起作用,它的检查器显示了一个奇怪的错误,
uncaughttypeerror:非法调用
。我的代码怎么了

var make = function(callback,params){
    callback(params);
}

make(console.log,'it will be accepted!');

控制台的日志功能期望
引用控制台(内部)。考虑一下复制你的问题的代码:

var x = {};
x.func = function(){
    if(this !== x){
        throw new TypeError('Illegal invocation');
    }
    console.log('Hi!');
};
// Works!
x.func();

var y = x.func;

// Throws error
y();
下面是一个(愚蠢的)示例,它可以工作,因为它将make函数中的
this
绑定到
控制台

var make = function(callback,params){
    callback.call(console, params);
}

make(console.log,'it will be accepted!');
这也会起作用

var make = function(callback,params){
    callback(params);
}

make(console.log.bind(console),'it will be accepted!');

您可以将需要“this”的函数包装为新的lambda函数,然后将其用于回调函数

function make(callback, params) {
  callback(params);
}

make(function(str){ console.log(str); }, 'it will be accepted!');

如果我用
console.log.bind(console)
替换
console.log.bind(console)
,它可以在Chrome 12中工作。@d这表明log期望作为控制台的一种方法被调用,即它的this关键字必须引用console对象。你的
make
函数相当于
callback.call(null,params)
我想指出,在旧版本的IE console.log中,它可以是一个可调用的主机对象(无需调用、应用或绑定方法),而不是一个函数。