Pregunta console.log () invocó un objeto que no sea la consola


Recuerdo que siempre cuando quería pasar console.log como un parámetro de devolución de llamada para alguna función, no funcionó a menos que use el bind() método para unir console lo.

Por ejemplo:

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

Ver Unkeught TypeError: invocación ilegal en javascript.

Sin embargo, recientemente noté que console.log() funciona bien incluso cuando se llama a un objeto que no sea la consola. Por ejemplo:

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

registros 'test'.

¿Cuándo y por qué cambió? ¿La especificación dice algo al respecto?


32
2017-09-14 21:23


origen


Respuestas:


Borrador de la API de consola del editor solía decir:

Las API de registro DEBEN ser todas funciones recuperables, lo que les permite pasarlas como argumentos para el manejo de errores de devolución de llamadas, para cada método, etc.

Esto ya no está incluido en la versión actual de la especificación.

Pensé que Chrome y Node.js lo cambiaron para funcionar como en la especificación, pero parece que funcionó así incluso antes.

Sigo sintiendo curiosidad cuando cambió y cuál fue el motivo de eso.


13
2017-09-14 21:23



No sé cuándo se realizó el cambio, pero tengo una idea de por qué no funcionó.

Considera el siguiente código

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'

Si rastrea el código, verá que cuando se llama a demo.getStr a través de otra función, this se refiere a windowy seno str no está definido dentro de window, vuelve undefined. Si lo llamaste directamente o vinculaste con demo, this se refiere a la demostración y, por lo tanto, devuelve 'demo'.

En nodeJS (v6.6.0), existe una clase llamada Console dentro del módulo de la consola, que el usuario puede canalizar explícitamente registros en un archivo (o cualquier flujo que un usuario le dé). De acuerdo con la especificación Node.js v6.6.0 api,

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

Console no existe en el navegador ya que no es necesario. La salida de la consola solo existe en un lienzo utilizado para la depuración, y hay exactamente una instancia de la misma. El usuario no puede, y no debería poder, canalizar la salida de la consola a ningún otro lugar, ya que se convertirá en un problema de seguridad grave. Debido a esto, los desarrolladores pueden hacer algo dentro de la función de registro como var x = this.x || console.x ya que hay exactamente una instancia del objeto de la consola.


0
2017-09-21 02:31