所以我很懒惰,喜欢给 console.info 一个新的函数名称 :) 但我也想安全起见,确保我可以离开我的登录状态,而不是在不支持控制台的浏览器中出错。 所以我写了这个:
if (typeof console == "object" && typeof console.error == "function") {
e = console.info;
}
现在问题只出现在 chrome 中,并得到如下错误:
Uncaught TypeError: Illegal invocation
对我来说,这似乎是一个非常普遍的错误。
最佳答案
最可能的解释是 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) { .. }
即可。 :-)
关于javascript - e = 控制台信息;不在 chrome 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8802649/