我正在创建一个 lambda 函数,该函数使用具体参数执行第二个函数。此代码在 Firefox 中有效,但在 Chrome 中无效,其检查器显示一个奇怪的错误,Uncaught TypeError: Illegal invocation
. 我的代码有什么问题?
var make = function(callback,params){
callback(params);
}
make(console.log,'it will be accepted!');
我正在创建一个 lambda 函数,该函数使用具体参数执行第二个函数。此代码在 Firefox 中有效,但在 Chrome 中无效,其检查器显示一个奇怪的错误,Uncaught TypeError: Illegal invocation
. 我的代码有什么问题?
var make = function(callback,params){
callback(params);
}
make(console.log,'it will be accepted!');
控制台的日志功能期望this
引用控制台(内部)。考虑这个复制你的问题的代码:
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();
这是一个可以工作的(愚蠢的)示例,因为它绑定this
到console
您的 make 函数中:
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!');