console.log的包装 - 非法调用

时间:2015-08-04 19:34:50

标签: javascript

我正在尝试为console.log编写一个包装器。

我在Function原型中找到了.apply函数,但它给了我错误:

function _log() {
    if (opts.debug) console.log.apply(this, arguments);
}

opts.debug是我的配置数组中的一个键。

错误:

Uncaught TypeError: Illegal invocation
    at :2:13
    at Object.InjectedScript._evaluateOn (:905:140)
    at Object.InjectedScript._evaluateAndWrap (:838:34)
    at Object.InjectedScript.evaluate (:694:21)

我尝试这样做的方式有什么问题?而且,怎么做对了?感谢。

2 个答案:

答案 0 :(得分:3)

console.log期望被称为console的方法,即console用于接收方(this参数,第一个参数为apply)。目前您正在将this传递给apply,无论这是什么(可能是全局对象),它都不是console对象。使用

function _log() {
    if (opts.debug) console.log.apply(console, arguments);
//                                    ^^^^^^^
}

答案 1 :(得分:2)

您在无效范围内调用console.log方法,为了使其有效,您必须在console的范围内调用它:

function _log() {
    if (opts.debug) console.log.apply(console, arguments);
}

经过多次测试后,似乎@Rob M.对他的评论是正确的。绑定必须使用console范围。