未捕获的 TypeError:javascript 中的非法调用

Posted

技术标签:

【中文标题】未捕获的 TypeError:javascript 中的非法调用【英文标题】:Uncaught TypeError: Illegal invocation in JavaScript 【发布时间】:2012-02-12 20:33:16 【问题描述】:

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

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


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

【问题讨论】:

如果我将 console.log 替换为 console.log.bind(console),它可以在 Chrome 12 中使用。 @DanD——表示 log 期望作为 console 的方法被调用,即它的 this关键字必须引用 console 对象。 你的make函数相当于callback.call(null,params) 我想指出,在旧版本的 IE 中,console.log 可以是一个可调用的主机对象(没有调用、应用或绑定方法)而不是一个函数。 ***.com/a/71283695/12910765 【参考方案1】:

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

这是一个可行的(愚蠢的)示例,因为它在您的 make 函数中将 this 绑定到 console

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!');

【讨论】:

【参考方案2】:

您可以将需要 'this' 的函数包装到一个新的 lambda 函数中,然后将其用于您的回调函数。

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


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

【讨论】:

以上是关于未捕获的 TypeError:javascript 中的非法调用的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 中的数组错误:未捕获的 TypeError:无法读取未定义的属性“x”

未捕获的 TypeError:forEach 不是 javascript 函数中的函数错误

Javascript:未捕获的 TypeError:无法读取 null 的属性“indexOf”

如何在 JavaScript 中将日期增加一个月?接收未捕获的 TypeError [关闭]

Javascript:未捕获的 TypeError:无法在 HTMLButtonElement.but.onclick 处设置属性“innerHTML”为空(

未捕获的 TypeError:app.all 不是函数