Skip to content

Commit a81278b

Browse files
committed
Translated the closure subchapter
1 parent 58d02d8 commit a81278b

File tree

1 file changed

+104
-104
lines changed

1 file changed

+104
-104
lines changed

03_funciones.md

Lines changed: 104 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -500,192 +500,192 @@ console.log("C", "O", 2);
500500
// → C O 2
501501
```
502502

503-
## Closure
503+
## Cierre
504504

505505
{{index "call stack", "local binding", [function, "as value"], scope}}
506506

507-
The ability to treat functions as values combined with the fact that
508-
local bindings are re-created every time a function is called brings
509-
up an interesting question. What happens to local bindings when the
510-
function call that created them is no longer active?
507+
La capacidad de tratar a las funciones como valores combinado con el hecho de
508+
que los enlaces locales se vuelven a crear cada vez que se una función es
509+
llamada, trae a la luz una pregunta interesante ¿Qué sucede con los
510+
enlaces locales cuando la llamada de función que los creó ya no está activa?
511511

512-
The following code shows an example of this. It defines a function,
513-
`wrapValue`, which creates a local binding. It then returns a function
514-
that accesses and returns this local binding.
512+
El siguiente código muestra un ejemplo de esto. Define una función,
513+
`envolverValor`, que crea un enlace local. Luego devuelve una función
514+
que accede y devuelve este enlace local.
515515

516516
```
517-
function wrapValue(n) {
517+
function envolverValor(n) {
518518
let local = n;
519519
return () => local;
520520
}
521521
522-
let wrap1 = wrapValue(1);
523-
let wrap2 = wrapValue(2);
524-
console.log(wrap1());
522+
let envolver1 = envolverValor(1);
523+
let envolver2 = envolverValor(2);
524+
console.log(envolver1());
525525
// → 1
526-
console.log(wrap2());
526+
console.log(envolver2());
527527
// → 2
528528
```
529529

530-
This is allowed and works as you'd hope—both instances of the binding
531-
can still be accessed. This situation is a good demonstration of the
532-
fact that local bindings are created anew for every call, and
533-
different calls can't trample on one another's local bindings.
530+
Esto está permitido y funciona como es de esperar — ambas instancias de
531+
los enlaces todavía se pueden acceder. Esta situación es una buena
532+
demostración del hecho de que los enlaces locales se crean de nuevo para
533+
cada llamada, y que las diferentes llamadas no pueden pisotear los enlaces
534+
locales entre sí.
534535

535-
This feature—being able to reference a specific instance of a local
536-
binding in an enclosing scope—is called _((closure))_. A function that
537-
_closes over_ some local bindings is called _a_ closure. This behavior
538-
not only frees you from having to worry about lifetimes of bindings
539-
but also makes it possible to use function values in some creative
540-
ways.
536+
Esta característica — poder hacer referencia a una instancia específica
537+
de un enlace local en un alcance adjunto — se llama _((cierre))_.
538+
Una función que _cierra sobre_ algunos enlaces locales se llama _un_
539+
cierre. Este comportamiento no solo te libera de tener que preocuparte
540+
por la duración de los enlaces pero también hace posible usar valores de
541+
funciones en algunas formas bastante creativas.
541542

542543
{{index "multiplier function"}}
543544

544-
With a slight change, we can turn the previous example into a way to
545-
create functions that multiply by an arbitrary amount.
545+
Con un ligero cambio, podemos convertir el ejemplo anterior en una forma de
546+
crear funciones que multiplican por una cantidad arbitraria.
546547

547548
```
548-
function multiplier(factor) {
549+
function multiplicador(factor) {
549550
return number => number * factor;
550551
}
551552
552-
let twice = multiplier(2);
553-
console.log(twice(5));
553+
let doble = multiplicador(2);
554+
console.log(doble(5));
554555
// → 10
555556
```
556557

557558
{{index [binding, "from parameter"]}}
558559

559-
The explicit `local` binding from the `wrapValue` example isn't really
560-
needed since a parameter is itself a local binding.
560+
El enlace explícito `local` del ejemplo `envolverValor` no es realmente
561+
necesario ya que un parámetro es en sí mismo un enlace local.
561562

562563
{{index [function, "model of"]}}
563564

564-
Thinking about programs like this takes some practice. A good mental
565-
model is to think of function values as containing both the code in
566-
their body and the environment in which they are created. When called,
567-
the function body sees its original environment, not the environment
568-
in which the call is made.
565+
Pensar en programas de esta manera requiere algo de práctica. Un buen modelo
566+
mental es pensar en los valores de función como que contienen tanto el código en
567+
su cuerpo tanto como al entorno en el que se crean. Cuando son llamadas,
568+
el cuerpo de la función ve su entorno original, no el entorno
569+
en el que se realiza la llamada.
569570

570-
In the example, `multiplier` is called, and creates an environment in
571-
which its `factor` parameter is bound to 2. The function value it
572-
returns, which is stored in `twice`, remembers this environment. So
573-
when that is called, it multiplies its argument by 2.
571+
En el ejemplo, se llama a `multiplicador` y esta crea un entorno en el
572+
que su parámetro `factor` está ligado a 2. El valor de función que
573+
regresa, el cual se almacena en `doble`, recuerda este entorno. Asi que
574+
cuando es es llamada, multiplica su argumento por 2.
574575

575-
## Recursion
576+
## Recursión
576577

577578
{{index "power example", "stack overflow", recursion, [function, application]}}
578579

579-
It is perfectly okay for a function to call itself, as long as it
580-
doesn't do it so often it overflows the stack. A function that calls
581-
itself is called _recursive_. Recursion allows some functions to be
582-
written in a different style. Take, for example, this alternative
583-
implementation of `power`:
580+
Está perfectamente bien que una función se llame a sí misma, siempre que
581+
no lo haga tan a menudo que desborde la pila. Una función que se llama
582+
a si misma es llamada _recursiva_. La recursión permite que algunas
583+
funciones sean escritas en un estilo diferente. Mira, por ejemplo,
584+
esta implementación alternativa de `potencia`:
584585

585586
```{test: wrap}
586-
function power(base, exponent) {
587-
if (exponent == 0) {
587+
function potencia(base, exponente) {
588+
if (exponente == 0) {
588589
return 1;
589590
} else {
590-
return base * power(base, exponent - 1);
591+
return base * potencia(base, exponente - 1);
591592
}
592593
}
593594
594-
console.log(power(2, 3));
595+
console.log(potencia(2, 3));
595596
// → 8
596597
```
597598

598599
{{index loop, readability, mathematics}}
599600

600-
This is rather close to the way mathematicians define exponentiation
601-
and arguably describes the concept more clearly than the looping
602-
variant. The function calls itself multiple times with ever smaller
603-
exponents to achieve the repeated multiplication.
601+
Esta es bastante parecida a la forma en que los matemáticos definen
602+
la exponenciación y posiblemente describa el concepto más claramente que
603+
la variante con el bucle. La función se llama a si misma muchas veces con
604+
cada vez exponentes más pequeños para lograr la multiplicación repetida.
604605

605606
{{index [function, application], efficiency}}
606607

607-
But this implementation has one problem: in typical JavaScript
608-
implementations, it's about 3 times slower than the looping version.
609-
Running through a simple loop is generally cheaper than calling a
610-
function multiple times.
608+
Pero esta implementación tiene un problema: en las implementaciones típicas de
609+
JavaScript, es aproximadamente 3 veces más lenta que la versión que usa un
610+
bucle. Correr a través de un bucle simple es generalmente más barato en
611+
terminos de memoria que llamar a una función multiples veces.
611612

612613
{{index optimization}}
613614

614-
The dilemma of speed versus ((elegance)) is an interesting one. You
615-
can see it as a kind of continuum between human-friendliness and
616-
machine-friendliness. Almost any program can be made faster by making
617-
it bigger and more convoluted. The programmer has to decide on an
618-
appropriate balance.
615+
El dilema de la velocidad versus ((elegancia)) es interesante.
616+
Puedes verlo como una especie de compromiso entre accesibilidad-humana y
617+
accesibilidad-maquina. Casi cualquier programa se puede hacer más
618+
rápido haciendolo más grande y complicado. El programador tiene que
619+
decidir sobre cual es un equilibrio apropiado.
619620

620-
In the case of the `power` function, the inelegant (looping) version
621-
is still fairly simple and easy to read. It doesn't make much sense to
622-
replace it with the recursive version. Often, though, a program deals
623-
with such complex concepts that giving up some efficiency in order to
624-
make the program more straightforward is helpful.
621+
En el caso de la función `potencia`, la versión poco elegante (con el bucle)
622+
sigue siendo bastante simple y fácil de leer. No tiene mucho sentido
623+
reemplazarla con la versión recursiva. A menudo, sin embargo, un programa trata
624+
con conceptos tan complejos que renunciar a un poco de eficiencia con el fin de
625+
hacer que el programa sea más sencillo es útil.
625626

626627
{{index profiling}}
627628

628-
Worrying about efficiency can be a distraction. It's yet another
629-
factor that complicates program design, and when you're doing
630-
something that's already difficult, that extra thing to worry about
631-
can be paralyzing.
629+
Preocuparse por la eficiencia puede ser una distracción. Es otro factor más
630+
que complica el diseño del programa, y ​​cuando estás haciendo
631+
algo que ya es difícil, algo más de lo que preocuparse puede ser paralizante
632632

633633
{{index "premature optimization"}}
634634

635-
Therefore, always start by writing something that's correct and easy
636-
to understand. If you're worried that it's too slow—which it usually
637-
isn't, since most code simply isn't executed often enough to take any
638-
significant amount of time—you can measure afterwards, and improve it
639-
if necessary.
635+
Por lo tanto, siempre comienza escribiendo algo que sea correcto y fácil de
636+
comprender. Si te preocupa que sea demasiado lento — que generalmente
637+
no lo es, ya que la mayoría del código simplemente no se ejecuta con la
638+
suficiente frecuencia como para tomar cantidades significativas de tiempo —
639+
puedes medir luego y mejorarlo si necesario.
640640

641641
{{index "branching recursion"}}
642642

643-
Recursion is not always just an inefficient alternative to looping.
644-
Some problems are really easier to solve with recursion than with
645-
loops. Most often these are problems that require exploring or
646-
processing several "branches", each of which might branch out again
647-
into even more branches.
643+
La recursión no siempre es solo una alternativa ineficiente al bucle.
644+
Algunos problemas son realmente más fáciles de resolver con recursión que con
645+
bucles. En la mayoría de los casos, estos son problemas que requieren explorar o
646+
procesar varias "ramas", cada una de las cuales podría ramificarse de nuevo
647+
en aún más ramas.
648648

649649
{{id recursive_puzzle}}
650650
{{index recursion, "number puzzle example"}}
651651

652-
Consider this puzzle: by starting from the number 1 and repeatedly
653-
either adding 5 or multiplying by 3, an infinite amount of new numbers
654-
can be produced. How would you write a function that, given a number,
655-
tries to find a sequence of such additions and multiplications that
656-
produce that number?
652+
Considera este acertijo: comenzando desde el número 1 y repetidamente
653+
agregando 5 o multiplicando por 3, una cantidad infinita de números nuevos
654+
pueden ser producidos. ¿Cómo escribirías una función que, dado un número,
655+
intente encontrar una secuencia de tales adiciones y multiplicaciones que
656+
produzca ese número?
657657

658-
For example, the number 13 could be reached by first multiplying by 3
659-
and then adding 5 twice, whereas the number 15 cannot be reached at
660-
all.
658+
Por ejemplo, se puede llegar al número 13 multiplicando primero por 3
659+
y luego agregando 5 dos veces, mientras que el número 15 no puede ser
660+
alcanzado de ninguna manera.
661661

662-
Here is a recursive solution:
662+
Aquí hay una solución recursiva:
663663

664664
```
665-
function findSolution(target) {
666-
function find(current, history) {
667-
if (current == target) {
668-
return history;
669-
} else if (current > target) {
665+
function encontrarSolucion(objetivo) {
666+
function encontrar(actual, historia) {
667+
if (actual == objetivo) {
668+
return historia;
669+
} else if (actual > objetivo) {
670670
return null;
671671
} else {
672-
return find(current + 5, `(${history} + 5)`) ||
673-
find(current * 3, `(${history} * 3)`);
672+
return encontrar(actual + 5, `(${historia} + 5)`) ||
673+
encontrar(actual * 3, `(${historia} * 3)`);
674674
}
675675
}
676-
return find(1, "1");
676+
return encontrar(1, "1");
677677
}
678678
679-
console.log(findSolution(24));
679+
console.log(encontrarSolucion(24));
680680
// → (((1 * 3) + 5) * 3)
681681
```
682682

683-
Note that this program doesn't necessarily find the _shortest_
684-
sequence of operations. It is satisfied when it finds any sequence at
685-
all.
683+
Ten en cuenta que este programa no necesariamente encuentra la secuencia de
684+
operaciones _mas corta_. Está satisfecho cuando encuentra cualquier secuencia
685+
que funcione.
686686

687-
It is okay if you don't see how it works right away. Let's work
688-
through it, since it makes for a great exercise in recursive thinking.
687+
Está bien si no ves cómo funciona el programa de inmediato. Vamos a trabajar
688+
a través de él, ya que es un gran ejercicio de pensamiento recursivo.
689689

690690
The inner function `find` does the actual recursing. It takes two
691691
((argument))s, the current number and a string that records how we

0 commit comments

Comments
 (0)