w3schools valor una tipos retornar pasar parametros llamar funciones funcion desde cual boton anonimas javascript ecmascript-6 strict

javascript - valor - ''llamante'' y ''argumentos'' son propiedades de funciones restringidas y no se puede acceder a ellas en este contexto



retornar valor de una funcion javascript (2)

Estoy tratando de crear una función de depuración simple que simplemente muestra al llamador de una función, como esto:

function xe() { console.log(xe.caller().name) }

Con esto solo podría agregar xe() a una función y registrará las llamadas a la función, solo una adición breve y simple para ayudar con la depuración. Depuración de azúcar, por así decirlo.

Desafortunadamente me sale el error de la línea de asunto:

TypeError: ''llamador'' y ''argumentos'' son propiedades de funciones restringidas y no se puede acceder en este contexto.

Estoy usando Babel / ES6, que inyecta "use strict" en la parte superior de cada módulo. Esto puede ser la causa, pero la búsqueda ha proporcionado información limitada sobre por qué se produce el error, y me gustaría entenderlo mejor.

Si el modo estricto es el problema, preferiría no deshabilitar el modo estricto para todo el proyecto, solo para el módulo / función.


Es la causa. Desde MDN :

en modo estricto ya no es posible "caminar" la pila de JavaScript a través de extensiones implementadas comúnmente a ECMAScript. En el código normal con estas extensiones, cuando una función fun se encuentra en medio de ser llamada, fun.caller es la función que más recientemente se llamó fun, y fun.arguments son los argumentos para esa invocación de fun. Ambas extensiones son problemáticas para el JavaScript "seguro" porque permiten que el código "protegido" tenga acceso a funciones "privilegiadas" y sus argumentos (potencialmente no seguros). Si fun está en modo estricto, tanto fun.caller como fun.arguments son propiedades que no se pueden eliminar que se lanzan cuando se configuran o recuperan:

Si estás haciendo ES6, en el caso general no puedes deshabilitar el modo estricto. Está implícito en ciertas condiciones , como cuando se está en un módulo ES6.

Si solo estás depurando, sugeriría usar un punto de interrupción en un depurador y verificar el marco de la pila, pero estoy seguro de que ya lo sabes.

Si solo está generando información de depuración, también podría, supongo que acaba de leer la pila de un objeto Error:

console.log(new Error().stack);

Puedes deshabilitarlo globalmente (pero me doy cuenta de que esto no es lo que quieres) use strict con babel.

require("6to5").transform("code", { blacklist: ["useStrict"] });

o

$ 6to5 --blacklist useStrict

Si debe eliminarlo a nivel de módulo, sospecho que tendrá que hacerlo usted mismo. Cadena básica reemplazar tal vez?

Adicionalmente, como se ha señalado en ES5. Debería ser xe.caller.name y no xe.caller().name o volvería a invocar la función.


Según this documentación. La propiedad Function.caller() devuelve la función que invocó la función especificada. Simplemente obtendrá la función de llamada completa cuando use xe.caller . Una vez más, está ejecutando la función de llamada. Aquí estás haciendo recursión y esa es la razón por la que no permite en modo estricto.

Puede ejecutar su función de muestra en la consola del navegador. obtendrá el Maximum call stack size exceeded error.