@@ -500,192 +500,192 @@ console.log("C", "O", 2);
500
500
// → C O 2
501
501
```
502
502
503
- ## Closure
503
+ ## Cierre
504
504
505
505
{{index "call stack", "local binding", [ function, "as value"] , scope}}
506
506
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 ?
511
511
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 .
515
515
516
516
```
517
- function wrapValue (n) {
517
+ function envolverValor (n) {
518
518
let local = n;
519
519
return () => local;
520
520
}
521
521
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 ());
525
525
// → 1
526
- console.log(wrap2 ());
526
+ console.log(envolver2 ());
527
527
// → 2
528
528
```
529
529
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í.
534
535
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 .
541
542
542
543
{{index "multiplier function"}}
543
544
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 .
546
547
547
548
```
548
- function multiplier (factor) {
549
+ function multiplicador (factor) {
549
550
return number => number * factor;
550
551
}
551
552
552
- let twice = multiplier (2);
553
- console.log(twice (5));
553
+ let doble = multiplicador (2);
554
+ console.log(doble (5));
554
555
// → 10
555
556
```
556
557
557
558
{{index [ binding, "from parameter"] }}
558
559
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 .
561
562
562
563
{{index [ function, "model of"] }}
563
564
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 .
569
570
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.
574
575
575
- ## Recursion
576
+ ## Recursión
576
577
577
578
{{index "power example", "stack overflow", recursion, [ function, application] }}
578
579
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 ` :
584
585
585
586
``` {test: wrap}
586
- function power (base, exponent ) {
587
- if (exponent == 0) {
587
+ function potencia (base, exponente ) {
588
+ if (exponente == 0) {
588
589
return 1;
589
590
} else {
590
- return base * power (base, exponent - 1);
591
+ return base * potencia (base, exponente - 1);
591
592
}
592
593
}
593
594
594
- console.log(power (2, 3));
595
+ console.log(potencia (2, 3));
595
596
// → 8
596
597
```
597
598
598
599
{{index loop, readability, mathematics}}
599
600
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 .
604
605
605
606
{{index [ function, application] , efficiency}}
606
607
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 .
611
612
612
613
{{index optimization}}
613
614
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 .
619
620
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 .
625
626
626
627
{{index profiling}}
627
628
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
632
632
633
633
{{index "premature optimization"}}
634
634
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 .
640
640
641
641
{{index "branching recursion"}}
642
642
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 .
648
648
649
649
{{id recursive_puzzle}}
650
650
{{index recursion, "number puzzle example"}}
651
651
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 ?
657
657
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 .
661
661
662
- Here is a recursive solution :
662
+ Aquí hay una solución recursiva :
663
663
664
664
```
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 ) {
670
670
return null;
671
671
} 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)`);
674
674
}
675
675
}
676
- return find (1, "1");
676
+ return encontrar (1, "1");
677
677
}
678
678
679
- console.log(findSolution (24));
679
+ console.log(encontrarSolucion (24));
680
680
// → (((1 * 3) + 5) * 3)
681
681
```
682
682
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 .
686
686
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 .
689
689
690
690
The inner function ` find ` does the actual recursing. It takes two
691
691
((argument))s, the current number and a string that records how we
0 commit comments