【问题标题】:Wrapper for console.log - Illegal invocationconsole.log 的包装器 - 非法调用
【发布时间】:2015-08-05 04:36:54
【问题描述】:

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

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

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

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

错误:

未捕获的类型错误:非法调用 在:2:13 在 Object.InjectedScript._evaluateOn (:905:140) 在 Object.InjectedScript._evaluateAndWrap (:838:34) 在 Object.InjectedScript.evaluate (:694:21)

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

【问题讨论】:

  • JavaScript 使用范围绑定。这篇文章很好的解释了JS中的this关键字The this keyword

标签: javascript


【解决方案1】:

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

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

【讨论】:

  • this 不是_log 函数吗?还是我把它和别的东西混淆了
  • @MightyPork:不,this 是调用 _log 函数的任何东西。在_log()(普通函数调用)的情况下,它是undefined(或草率模式下的全局对象)。有关详细信息,另请参阅MDN
  • 哦,我明白了。我的意思是如果你用new 来创建函数的“实例”,对吧?
  • @MightyPork 是的,如果你将函数调用为new _log(),那么this 将引用新创建的实例(但仍然不是_log 函数本身)。
【解决方案2】:

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

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

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

【讨论】:

  • 嗯,我不明白为什么这有效,但确实有效。
  • 你不必在window范围内调用它,你应该使用console作为范围
猜你喜欢
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多