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

IT技术 javascript lambda functional-programming invocation
2021-02-07 17:51:31

我正在创建一个 lambda 函数,该函数使用具体参数执行第二个函数。此代码在 Firefox 中有效,但在 Chrome 中无效,其检查器显示一个奇怪的错误,Uncaught TypeError: Illegal invocation. 我的代码有什么问题?

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

make(console.log,'it will be accepted!');
2个回答

控制台的日志功能期望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();

这是一个可以工作的(愚蠢的)示例,因为它绑定thisconsole您的 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!');