DanLevy.net

JavaScript Mágico

[borrador] Imperativo vs. Recursivo vs. Funcional

Hero image for JavaScript Mágico

Imperativo vs. Recursivo vs. Funcional

[ En progreso ]

// Imperativo: El más rápido ( + muy simple, sin nuevos punteros ni asignaciones excesivas ):
function fib(n) {
var a = 1,
b = 1,
c = 0;
for (var i = 1; i < n - 1; ++i) {
c = a + b;
a = b;
b = c;
}
return b;
}
// Recursivo: (SÓLO FIREFOX O BABELJS) Definición de función ES6 con
// valores predeterminados usados para establecer valores iniciales (internos/recursivos)
function fib(n, current = 0, a = 1, b = 1, c = 0) {
current++;
c = a + b;
a = b;
b = c;
return current >= n ? b : fib(n, current, a, b, c);
}
// Ejemplo de libro de texto malo - mala gestión del alcance de la función con múltiples valores mutables externos
function fib(n) {
if (!arr) {
var arr = [1, 1];
n = n - 2;
} // Mal
if (n === -1) {
return [arr[0]];
}
if (n === 0) {
return arr;
}
var proc = function() {
--n;
arr.push(arr[arr.length - 1] + arr[arr.length - 2]);
return n === 0 ? arr : proc();
// Mal: no se necesita función recursiva interna, pista: las variables usadas provienen del alcance de la función padre
};
var ans = proc();
return ans[ans.length - 1];
}

Promesas: ¡Genial!

// Ejemplo usando promesas Bluebird y
var Promise = require("bluebird"),
fs = Promise.promisifyAll(require("fs")),
less = Promise.promisifyAll(require("less"));
function writeFileData(data) {
return fs.writeFileAsync("/tmp/output.css", data);
}
// Bluebird hace que algo como esto sea perhaps incómodamente simple y conciso:
fs.readFileAsync("./style.less") // Llama a readFile() promisificado
.then(less.renderAsync) // Pasa a less.render
.then(writeFileData); // Función que recibe los contenidos css (primer parámetro)
  1. Mientras las promesas nativas de ES6 son buenas, prefiero la robusta Biblioteca de Promesas Bluebird.
  2. Con o sin biblioteca, los navegadores modernos han soportado Promesas durante años.
  3. Las promesas pueden usarse sin patrones complicados - la deferred implícita es preferible.
  4. $q es horrible usa bluebird, véase arriba.
  5. Vale la pena mencionar: los benchmarks de Bluebird son pruebas en condiciones ideales, así que tenlo en cuenta si haces cadenas de promesas complejas

Java vs JavaScript

Limitación de Velocidad / Debounce / Throttle

  1. En JavaScript David Walsh implementó debounce en menos de 20 líneas!
  2. En Java, JDebounce, una librería mucho más compleja, tiene ~500+ líneas.
  3. _ Comparando las dos: _
  4. El JavaScript es rápido y usa funciones de primera clase para lograr una simplicidad brillante.
  5. Mientras que el Java tiene muchas más partes móviles, se usan anotaciones para aplicar comportamiento en tiempo de compilación, y hay un montón de XML, solo por diversión!