我正在使用sinon.js进行测试,但这与此无关。原始的sinon实现包含以下代码:
sinon = {
log: function() {}
//...
}
只有一个存根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
对象设置为控制台吗?
我要求解释:内部如何工作,为什么会出现这个错误,为什么我的第二个实现是正确的。
答案 0 :(得分:1)
这适用于jsfiddle:
sinon.log = console.log.bind(console)
(jsfiddle:http://jsfiddle.net/vjotqjka/)
console.log对此有一种奇怪的行为, 这就是我使用console.log.bind(console)将其设置为控制台的原因。 console.log的行为与其不是浏览器特定的,并且按预期工作。 此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