Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript将console.log分配给对象_Javascript_Console_This - Fatal编程技术网

javascript将console.log分配给对象

javascript将console.log分配给对象,javascript,console,this,Javascript,Console,This,我正在使用sinon.js进行测试,但这与本文无关。原始sinon实现包含以下代码: sinon = { log: function() {} //... } 只有一个存根log函数要被用户覆盖,高级sinon函数使用它。这是有道理的。现在我试着为自己定义sinon.log函数: sinon.log = console.log; 当我试图记录一些东西时,我会犯一个我不知道的严重错误;我不清楚: sinon.log(1) > TypeError: Illegal invocati

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

sinon = {
  log: function() {}
  //...
}
只有一个存根
log
函数要被用户覆盖,高级sinon函数使用它。这是有道理的。现在我试着为自己定义sinon.log函数:

sinon.log = console.log;
当我试图记录一些东西时,我会犯一个我不知道的严重错误;我不清楚:

sinon.log(1)
> TypeError: Illegal invocation
我发现它与javascript中的
上下文有关,因为当我将此实现更改为:

sinon.log = function(){ console.log.apply(console, arguments) };
它适用于n个参数(就像console.log一样)。但是我不知道为什么我应该将
this
对象设置为console对象。它是否依赖于内部浏览器实现(我使用的是chrome)?是否有任何标准,例如,在这种情况下,我应该始终将
对象设置为console


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

这在JSFIDLE中适用:

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

console.log的this具有wierd行为, 这就是为什么我使用console.log.bind(console)将其this集保留到console。 console.log的行为与它的this无关,它是按预期工作的。 这个答案看起来是相关的:

有关function.prototype.bind的更多信息,请参见:

适用于所有浏览器。当我打开chrome控制台并从你的小提琴上运行代码时,我得到
非法调用
错误。chrome版本是什么?问题不在于“这”,而是控制台。@Zanval回答证明它。此外,你可以编写sinon.log=function(arg){console.log(arg);}没有应用。@hex4949 version 36.0.1985.143@cox我想使用
参数
来获取原始
控制台.log
行为(要记录多个参数)-这就是为什么我使用
.apply