所以我很懒,并且想给console.info一个新的函数名称:)但我也想安全并确保我可以保留登录而不是错误的浏览器不支持控制台。 所以我写了这个:
if (typeof console == "object" && typeof console.error == "function") {
e = console.info;
}
现在问题只发生在chrome中并出现以下错误:
Uncaught TypeError: Illegal invocation
对我而言,这似乎是一个非常普遍的错误。
答案 0 :(得分:7)
最可能的解释是console
对象的info
函数期望函数中的this
将是console
对象。如果你这样做,情况就不是这样了:
var e = console.info;
e("Foo");
请记住,在JavaScript中,this
完全由如何调用函数定义,而不是定义它的位置。更多:Mythical methods和You must remember this
。
你必须这样做:
e.call(console, "Foo");
......显然不短。
为了可靠地执行此操作,您必须创建一个函数:
function e(msg) {
console.info(msg);
}
jAndy指出我们也可以使用Function#bind
(ES5的一部分),因为Chrome有这个功能,而在Chrome上,console.info
是一个真正的JavaScript功能。所以:
e = console.info.bind(console);
这只适用于支持ES5的浏览器(例如,不是IE8及更早版本),console.info
是真正的 JavaScript函数(某些浏览器上的某些主机提供的函数)不是,虽然我认为console.info
大多数(如果不是全部)。但如果您的目标是Chrome,那么您就是金色的。此外,bind
是ES5功能之一,在非ES5浏览器(es5-shim.js project和其他几个浏览器)中实现非常简单。但是纯粹为这一次使用实现bind
可能有点过分,只需使用上面的function e(msg) { .. }
即可。 : - )