javascript - nodejs - console.log() invocó un objeto que no sea la consola
console.log variable (2)
Recuerdo que siempre que quería pasar console.log
como parámetro de devolución de llamada a alguna función, no funcionaba a menos que utilizara el método bind()
para vincular la console
a él.
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 UnEdge 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?
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
refiere a la window
, y sine str
no se define dentro de la window
, se devuelve undefined
. Si lo llamaste directamente o vinculaste con una demostración, this
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
var x = this.x || console.x
ya que hay exactamente una instancia del objeto de la consola.
El borrador del borrador de la API de la consola 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.