Estoy tratando de entender la programación funcional y vi el siguiente ejemplo:
function onceOnly(f) { var hasRun = false; return function() { if(!hasRun){ hasRun = true; return f(); } } } // Call as many times as you like var sendWelcomeEmail = onlyOnce(function() { emailServer.send(...); });Hay algunas cosas que no entiendo sobre esto.
emailServer.send(...) se llamará solo una vez. ¿Cómo lo hace? ¿Cómo se guarda el estado de hasRun ?f() dentro onceOnly(f) ? ¿Por qué no hicimos simplemente lo siguiente? function onceOnly(f) { var hasRun = false; if(!hasRun){ hasRun = true; return f(); } }La fuente de este código se puede encontrar aquí
Gracias.
El objetivo de onlyOnce es devolver una función, no llamar a una función. Su segundo ejemplo es llamar a la función y devolver el resultado de f .
Considerando que, con la primera implementación
//return a reference to an anonymous function var sendWelcomeEmail = onlyOnce(...); //you can use it to call after sendWelcomeEmail(); Simplemente coloque un console.log() justo antes de return f() y verá la diferencia.
hasRun se inicia primero con false . Una vez que se llama a sendWelcomeEmail() , hasRun se establecerá en true . Dado que sendWelcomeEmail hace referencia a una función anónima, es única y existe en la memoria, una segunda llamada a esta misma función no activará f() porque hasRun también tiene una referencia única y se memoriza.