Mi código funciona pero con paréntesis adicionales como myfunction()(); . Debería ejecutarse con un solo paréntesis como de costumbre, por ejemplo myfunction(); .
Estoy construyendo console.time(); console.timeEnd(); polyfill para navegadores (p. ej., <IE10) que no tienen nativo incorporado. Nota: Tengo polyfill bind() en caso de que creas que <IE10 no lo tiene.
Aquí está mi código en "archivo polyfill.js".
(function() { 'use strict'; var console=window.console, timers={}; if (!console.time) { console.time = function(name) { var datenow = Date.now(); name = name? name: 'default'; if (timers[name]) { console.warn('Timer "'+name+'" already exists.'); } else timers[name] = datenow; }; console.timeEnd = function(name) { var datenow = Date.now(); name = name? name: 'default'; if (!timers[name]) { console.warn('Timer "'+name+'" does not exists.'); } else { var endt = datenow - timers[name]; delete timers[name]; //below is the line where some changes are needed, But I don't know how. return window.console.log.bind(window.console, name+ ': ' +endt+ 'ms'); } }; } }()); Ahora en otro archivo "archivo main.js", cuando uso console.time(); console.timeEnd(); , debe registrar el número de línea de código de este archivo en la consola del navegador (no el número de línea del archivo polyfill.js). Por supuesto que funciona, pero observe el paréntesis adicional "()()" debajo del cual no está bien.
console.time(); //any code for performance test goes here. console.timeEnd()(); //Note here "()()". It should be single "()"He consultado estas 2 preguntas de stackoverflow, pero no pude encontrar la respuesta correcta.
También revisé new Error().stack; como una opción, pero tampoco es compatible con aquellos navegadores para los que estoy creando mi polyfill.
Nota: Si alguien puede sugerir una solución con eval(); , puedes. También es aceptable para mí.
De hecho, hay una función para eso llamada console.trace , sobre la cual puedes leer más en la página de MDN . Lo que hace es imprimir todo el seguimiento de la pila hasta la línea desde donde se ha llamado.
Entonces, por ejemplo, ejecutando el siguiente código:
function firstFunc() { secondFunc(); } function secondFunc() { console.trace('I was called here!'); } console.log('Calling firstFunc:'); firstFunc();imprimirá esta salida en la consola:
Calling firstFunc: I was called here! secondFunc @ VM141:6 firstFunc @ VM141:2 (anonymous) @ VM141:10 // Internal browser trace Tenga en cuenta que en el resultado dado, todas las funciones se llaman y definen en la consola de Chrome, por lo tanto, @ VM141: . Generalmente, imprime el archivo en lugar de VM. Entonces, si se hubiera ubicado en un archivo index.js , se vería así:
Calling firstFunc: I was called here! secondFunc @ index.js:8Nota de compatibilidad
El método anterior funciona para cualquier navegador cuerdo e IE11+. Eso se debe a la implementación de console.trace solo en IE11. Sin embargo, según la solicitud de OP, puedo pensar en una forma creativa de admitir IE10, y eso es mediante el uso de la propiedad Error.prototype.stack . Ahora, por supuesto, como lo menciona el mismo MDN, es una característica no estándar que no debe usarse en producción, pero tampoco es compatible con IE6.
Al crear una instancia de Error y luego imprimir su pila, puede lograr un resultado similar.
const sumWithTrace = (num1, num2) => { console.log(new Error().stack); // Creating a new error for its stack property return num1 + num2; }; sumWithTrace(1, 5); // returns 6 and prints trace in console