Me enfrenté a este problema recientemente. Podría pasar el problema, pero no entendí el concepto detrás de él. Si prueba el fragmento, verá lo que está pasando. ¿Alguien puede explicarlo?
function func1() { console.log('Func1 executed.'); }; const func2 = () => { console.log('Func2 executed.'); }; const test = () => { window['func1'](); //Working window['func2'](); //Not working }; button { width: 200px; padding: 20px; font-size: large; cursor: pointer; border: 0; background: linear-gradient(to top right, gray, silver); color: white; border-radius: 7px; box-shadow: 0px 5px 7px silver; text-shadow: 0px 2px 2px rgba(0,0,0,0.5); } <button onclick='test()'>Execute</button>La respuesta directa es:
Las variables globales inicializadas con let y const no se convierten en propiedades de window .
Ver:
constLas constantes globales no se convierten en propiedades del objeto
window, a diferencia de las variablesvar.
Fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
y:
letAl igual que
const,letno crea propiedades del objetowindowcuando se declara globalmente (en el ámbito superior).
Fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
El problema es que realmente está llamando a un valor/variable ( const func2 = podría terminar con un int, por ejemplo). Debe pasar una función en sí misma a la window[Functioname]() .
Puede hacer esto a través de llamadas de función de segundo grado, consulte a continuación.
Bonito botón por cierto.
function func1() { console.log('Func1 executed.'); }; const func2 = () => { console.log('Func2 executed.'); }; function func3(){ func2(); } const test = () => { window['func1'](); //Working window['func3'](); //Working window['func2'](); //Not working }; button { width: 200px; padding: 20px; font-size: large; cursor: pointer; border: 0; background: linear-gradient(to top right, gray, silver); color: white; border-radius: 7px; box-shadow: 0px 5px 7px silver; text-shadow: 0px 2px 2px rgba(0,0,0,0.5); } <button onclick='test()'>Execute</button>No tengo mucha experiencia con JS, pero creo que es porque la primera es en realidad una función que se puede reutilizar varias veces, mientras que la segunda es la función lambda con el propósito de devolver y almacenar un valor (pero no volver a calcular) en la func2 var.
Corrígeme si me equivoco.