e = console.info;没有使用chrome

时间:2012-01-10 11:36:32

标签: javascript google-chrome console

所以我很懒,并且想给console.info一个新的函数名称:)但我也想安全并确保我可以保留登录而不是错误的浏览器不支持控制台。 所以我写了这个:

if (typeof console == "object" && typeof console.error == "function") {
    e = console.info; 
}

现在问题只发生在chrome中并出现以下错误:

Uncaught TypeError: Illegal invocation

对我而言,这似乎是一个非常普遍的错误。

1 个答案:

答案 0 :(得分:7)

最可能的解释是console对象的info函数期望函数中的this将是console对象。如果你这样做,情况就不是这样了:

var e = console.info;
e("Foo");

请记住,在JavaScript中,this完全由如何调用函数定义,而不是定义它的位置。更多:Mythical methodsYou 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) { .. }即可。 : - )

Live example of all of the above