未捕获类型错误:javascript中的非法调用
我正在创建一个lambda函数,它执行第二个带有具体参数的函数。这段代码在Firefox中有效,但在Chrome中不起作用,它的检查器显示了一个奇怪的错误,未捕获类型错误: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!'); 控制台的日志功能期望此引用控制台(内部)。考虑一下复制你的问题的代码:
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中,它可以是一个可调用的主机对象(无需调用、应用或绑定方法),而不是一个函数。