未捕获的 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”为空(