【问题标题】:console.log() called on object other than consoleconsole.log() 在控制台以外的对象上调用
【发布时间】:2017-01-22 19:33:37
【问题描述】:

我记得总是当我想将console.log 作为回调参数传递给某个函数时,除非我使用bind() 方法将console 绑定到它,否则它不起作用。

例如:

const callWithTest = callback => callback('test');
callWithTest(console.log); // That didn't use to work.
callWithTest(console.log.bind(console)); // That worked (and works) fine.

Uncaught TypeError: Illegal invocation in javascript

但是,最近我注意到 console.log() 即使在控制台以外的对象上调用时也能正常工作。例如:

console.log.call(null, 'test');

记录'test'

它何时以及为何改变?规范有什么说明吗?

【问题讨论】:

  • 顺便说一句,Opera(旧版)自古就有这个...

标签: javascript this console.log function-binding


【解决方案1】:

Editor's Draft of Console API曾经说过:

日志 API 应该都是可调用函数,允许它们作为参数传递给错误处理回调、forEach 方法等。

这不再包含在the current version of the specification 中。

我认为 Chrome 和 Node.js 将其更改为像规范中那样工作,但似乎它甚至在它之前也是这样工作的。

我仍然很好奇它是什么时候改变的,是什么原因。

【讨论】:

    【解决方案2】:

    我不知道何时进行了更改,但我知道为什么它不起作用。

    考虑下面的代码

    callWithTest = callback => callback('test');
    var Demo = function () {this.str = 'demo';}
    Demo.prototype.getStr = function () { return this.str;}
    demo = new Demo ();
    demo.getStr(); // returns 'demo'
    callWithTest(demo.getStr); // returns undefined
    window.str = 'window';
    callWithTest(demo.getStr); // returns 'window'
    

    如果你跟踪代码,你会看到当 demo.getStr 通过另一个函数被调用时,this 引用了window,并且正弦str 没有在window 中定义,它返回undefined .如果你直接调用它或者绑定demo,this指的是demo,因此它返回'demo'。

    在 nodeJS (v6.6.0) 中,在控制台模块中有一个名为 Console 的类,用户可以将日志显式地通过管道传输到文件(或用户喜欢的任何流)中。根据 Node.js v6.6.0 api 规范,

    console = new Console(process.stdout, process.stderr);
    

    Console 在浏览器中不存在,因为它不是必需的。控制台的输出仅存在于用于调试的画布中,并且只有一个实例。用户不能也不应该将控制台的输出通过管道传输到任何其他地方,因为这将成为一个严重的安全问题。因此,开发人员可以在日志函数中做一些事情,比如var x = this.x || console.x,因为控制台对象只有一个实例。

    【讨论】:

    • Console 确实存在于 Firefox 中。此外,用户可以通过简单地覆盖 console.log() 函数(这就是 Stack Snippets 中的虚拟控制台的工作方式)来管道输出控制台。
    • 用另一个函数替换 console.log 不是管道。如果您可以将控制台输出通过管道传输到文件,那么您可以使用它在客户端 PC 上构建一个可执行文件。在 nodeJS 中,如果您想将所有消息重定向到一个文件或多个文件,则可以在运行时重新创建控制台对象。
    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多