javascript 将 console.log 分配给一个对象

标签 javascript console this

我正在使用 sinon.js 进行测试,但它与这里无关。原始 sinon 实现包含以下代码:

sinon = {
  log: function() {}
  //...
}

只有一个 stub log函数可以被用户覆盖,更高级别的sinon函数使用它。这就说得通了。现在我尝试为自己定义 sinon.log 函数:

sinon.log = console.log;

当我尝试记录某些内容时,我收到一个令人讨厌的错误,我不太明白:

sinon.log(1)
> TypeError: Illegal invocation

我发现它与javascript中的this上下文有关,因为当我将此实现更改为:

sinon.log = function(){ console.log.apply(console, arguments) };

它适用于 n 个参数(就像 console.log 一样)。但我不知道为什么要把 this 对象设置为控制台对象。它是否依赖于内部浏览器实现(我使用的是 chrome)?有没有什么标准,例如在这种情况下,我应该始终将 this 对象设置为控制台吗?

我要求解释:内部是如何工作的,为什么会出现这个错误以及为什么我的第二个实现是正确的。

最佳答案

这在 jsfiddle 中对我有用:

sinon.log = console.log.bind(console)

(jsfiddle:http://jsfiddle.net/vjotqjka/)

console.log 有一个奇怪的行为, 这就是为什么我使用 console.log.bind(console) 将其 this 设置为控制台。 console.log 及其 this 的行为不是特定于浏览器的,并且按预期工作。 这个 stackoverflow 答案看起来相关:TypeError: Illegal Invocation on console.log.apply

有关 function.prototype.bind 的更多信息可以在这里找到: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

关于javascript 将 console.log 分配给一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25470031/

相关文章:

java - 在当前控制台窗口中创建一个新进程

java - 为什么这个程序不给出歧义错误

jquery - 使点击事件之外的 jQuery 变量可供其他函数使用

函数中的 JavaScript 变量

javascript - 如何使用 Selenium x-path 查找包含单词 "download"的所有元素?

javascript - 数字()与新数字()?

c - 在 Mac 上的新终端窗口中启动进程

c# - 如何将控制台输出管道输出到出现的 ASP.NET 页面?

javascript - 悬停父div时,更改子div的背景色

javascript - 如何发送 pdf 以在 Angular 中单击按钮进行打印?