Jam*_*ber 2 javascript console google-chrome
所以我很懒,喜欢给console.info一个新的函数名称:)但我也想安全,并确保我可以保留我的登录,而不是在不支持控制台的浏览器中出错.所以我写了这个:
if (typeof console == "object" && typeof console.error == "function") {
e = console.info;
}
Run Code Online (Sandbox Code Playgroud)
现在问题只出现在chrome中,并收到以下错误:
Uncaught TypeError: Illegal invocation
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是一个非常普遍的错误.
最可能的解释是console对象的info函数期望this函数内的console对象.如果你这样做,情况就不是这样了:
var e = console.info;
e("Foo");
Run Code Online (Sandbox Code Playgroud)
请记住,在JavaScript中,this完全由函数的调用方式定义,而不是在定义函数的位置.更多:神话方法和你必须记住this.
你必须这样做:
e.call(console, "Foo");
Run Code Online (Sandbox Code Playgroud)
......显然不短.
因此,为了可靠地执行此操作,您必须创建一个函数:
function e(msg) {
console.info(msg);
}
Run Code Online (Sandbox Code Playgroud)
jAndy指出我们也可以使用Function#bind(ES5的一部分),因为Chrome有这个,而且在Chrome上,它console.info是一个真正的JavaScript功能.所以:
e = console.info.bind(console);
Run Code Online (Sandbox Code Playgroud)
这将只(例如所以,不是IE8和更早版本)在支持ES5的浏览器工作,并在那里console.info是一个真正的 JavaScript函数(在某些浏览器的一些主机提供的功能都没有,但我认为console.info是大多数,如果不是全部).但如果您的目标是Chrome,那么您就是金色的.此外,bindES5功能之一是在非ES5浏览器中实现的(es5-shim.js项目和其他几个项目).但bind纯粹为这一用途实施可能是矫枉过正,只需使用function e(msg) { .. }上述内容即可.:-)
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |