【问题标题】:e = console.info; not working in chromee = 控制台信息;不能在铬中工作
【发布时间】:2012-01-10 11:36:31
【问题描述】:

所以我很懒,喜欢给 console.info 一个新的函数名 :) 但我也喜欢安全并确保我可以在不支持控制台的浏览器中保持登录状态并且不会出错。 所以我写了这个:

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

现在问题只出现在chrome中,并得到如下错误:

Uncaught TypeError: Illegal invocation

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

【问题讨论】:

    标签: javascript google-chrome console


    【解决方案1】:

    最可能的解释是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) { .. }。 :-)

    Live example of all of the above

    【讨论】:

    • @jAndy:不错的主意,我们当然知道 Chrome 有 Function#bind。但是你需要 0 最后是 console。
    • var e = Function.prototype.call.bind( console.info.bind(console), 0 );
    • @T.J.Crowder:事实上,你需要两个 .bind() 调用才能让它工作,糟透了。但出于学术原因我会离开它:)
    • @jAndy:不,只有一个人这样做。查看更新的答案,感谢您指出。
    • @T.J.Crowder:我现在很困惑。这意味着什么?我们将console 对象作为第一个参数传递给console.info?
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多