makeAdder
devuelve una función a la que puede pasar el parámetro y
. Se establece en el momento de la invocación, a diferencia de x
que se establece en el momento de la creación de la nueva función (en el momento de la invocación de makeAdder
).
Para el caso de este ejemplo, la salida es equivalente a haber escrito:
function add10(y) {
return 10 + y;
}
console.log(add10(2)); // 12
Nada nuevo que está pasando aquí. El código de muestra intenta principalmente ilustrar que se está creando un cierre para x
.
Así makeAdder
, aquí, es bien llamado: cuando se pasa de 10 a ella, le da una función que agregará 10 a todo lo que pasa a la nueva función.
var add10 = makeAdder(10);
var add20 = makeAdder(20);
console.log(add10(1) + add20(1)); // 32
Seguramente, con el propósito de añadir, podría ser más fácil simplemente tener una función que acepta dos parámetros y los añade. Pero esta no es una lección para agregar, es una lección de cierres.
un escenario del mundo real podría ser algo como esto:
var buttons = document.getElementsByClassName('myButton');
for(var i = 0; i < buttons.length; i++) {
buttons[i].onclick = function() {
alert('You clicked button ' + i);
};
}
En el código anterior, i
se han reiterado a través de todo el conjunto antes que cualquiera de los botones se hace clic. Por lo tanto, todos los botones alertarán sobre buttons.length
. En su lugar, podría hacer lo siguiente:
var makeAlert = function(x) {
return function() {
alert('You clicked button ' + x);
};
};
for(var i = 0; i < buttons.length; i++) {
buttons[i].onclick = makeAlert(i);
}
La diferencia aquí es que i
no está siendo utilizado cuando se hace clic en el botón (que será después de toda la iteración), pero se usa durante la iteración, en un momento en que i
tendrá tiene un valor diferente para cada botón.
En lugar de crear una variable, makeAlert
, verá a menudo este tipo de código que se escribe como una función anónima, invocado inmediatamente. El siguiente código es esencialmente equivalente al código anterior:
for(var i = 0; i < buttons.length; i++) {
buttons[i].onclick = (function(x) {
return function() {
alert('You clicked button ' + x);
};
})(i);
}
veo, mi cerebro todavía está tratando de conseguirlo, im tratando de ver cómo se pasa o se establece cuando no hay referencia, ya que add10 (3) en mi cabeza dice que su configuración X no es así ?? Esto parece bastante confuso :( – mustafa
No, 'x' está establecido en' 10' en la llamada 'makeAdder (10)'. 'Y' está establecido en' 2' en la llamada 'add10 (2)'. –
Pero no debería makeAdder (10, 2) ¿hace lo mismo? o ¿lo que estamos haciendo es básicamente makeAdder (10). (2)? muchas gracias chicos por cierto :) – mustafa