Skip to content

Commit b6fd465

Browse files
authored
Merge pull request #569 from joaquinelio/deko
deco actualiz
2 parents 3064005 + 299bf98 commit b6fd465

File tree

8 files changed

+31
-32
lines changed

8 files changed

+31
-32
lines changed

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function spy(func) {
22

33
function wrapper(...args) {
4-
// using ...args instead of arguments to store "real" array in wrapper.calls
4+
// usamos ...args en lugar de arguments para almacenar un array "real" en wrapper.calls
55
wrapper.calls.push(args);
66
return func.apply(this, args);
77
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
function spy(func) {
2-
// your code
2+
// tu código
33
}
44

55

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 5
44

55
# Decorador espía
66

7-
Cree un decorador `spy(func)` que debería devolver un contenedor que guarde todas las llamadas para que funcionen en su propiedad `calls`
7+
Cree un decorador `spy(func)` que devuelva un contenedor el cual guarde todas las llamadas a la función en su propiedad `calls`
88

99
Cada llamada se guarda como un array de argumentos.
1010

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/02-delay/solution.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ let f1000 = delay(alert, 1000);
1414
f1000("test"); // mostrar "test" después de 1000ms
1515
```
1616

17-
Tenga en cuenta cómo se utiliza una función de flecha aquí. Como sabemos, las funciones de flecha no tienen contextos propios `this` ni `argumentos`, por lo que `f.apply(this, arguments)` toma `this` y `arguments` del contenedor.
17+
Tenga en cuenta cómo se utiliza una función de flecha aquí. Como sabemos, las funciones de flecha no tienen contextos propios `this` ni `arguments`, por lo que `f.apply(this, arguments)` toma `this` y `arguments` del contenedor.
1818

1919
Si pasamos una función regular, `setTimeout` lo llamaría sin argumentos y `this = window` (suponiendo que estemos en el navegador).
2020

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/03-debounce/debounce.view/index.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
<!doctype html>
22
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
33

4-
Function <code>handler</code> is called on this input:
4+
La función <code>handler</code> se llama en este input:
55
<br>
66
<input id="input1" placeholder="type here">
77

88
<p>
99

10-
Debounced function <code>debounce(handler, 1000)</code> is called on this input:
10+
La función <code>debounce(handler, 1000)</code> se llama en este input:
1111
<br>
1212
<input id="input2" placeholder="type here">
1313

1414
<p>
15-
<button id="result">The <code>handler</code> puts the result here</button>
15+
<button id="result">El <code>handler</code> pone el resultado aquí</button>
1616

1717
<script>
1818
function handler(event) {

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/_js.view/solution.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ function throttle(func, ms) {
77
function wrapper() {
88

99
if (isThrottled) {
10-
// memo last arguments to call after the cooldown
10+
// memoriza el último arguments para llamarlos después del enfriamiento
1111
savedArgs = arguments;
1212
savedThis = this;
1313
return;
1414
}
1515

16-
// otherwise go to cooldown state
16+
// de otro modo pasa al estado de enfriamiento
1717
func.apply(this, arguments);
1818

1919
isThrottled = true;
2020

21-
// plan to reset isThrottled after the delay
21+
// se prepara para reiniciar isThrottled después del delay
2222
setTimeout(function() {
2323
isThrottled = false;
2424
if (savedArgs) {
25-
// if there were calls, savedThis/savedArgs have the last one
26-
// recursive call runs the function and sets cooldown again
25+
// si hubo llamadas, savedThis/savedArgs tienen la última
26+
// llamada recursivas ejecutan la función y establece el enfriamiento de nuevo
2727
wrapper.apply(savedThis, savedArgs);
2828
savedArgs = savedThis = null;
2929
}

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/task.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ En otras palabras, "throttle" es como una secretaria que acepta llamadas telefó
1616

1717
Revisemos una aplicación de la vida real para comprender mejor ese requisito y ver de dónde proviene.
1818

19-
**Por ejemplo, queremos rastrear los movimientos del mouse.**
19+
**Por ejemplo, queremos registrar los movimientos del mouse.**
2020

2121
En un navegador, podemos configurar una función para que se ejecute en cada movimiento del mouse y obtener la ubicación del puntero a medida que se mueve. Durante un uso activo del mouse, esta función generalmente se ejecuta con mucha frecuencia, puede ser algo así como 100 veces por segundo (cada 10 ms).
2222
**Nos gustaría actualizar cierta información en la página web cuando se mueve el puntero.**
2323

2424
...Pero la función de actualización `update()` es demasiado pesada para hacerlo en cada micro-movimiento. Tampoco tiene sentido actualizar más de una vez cada 100 ms.
2525

26-
Entonces lo envolveremos en el decorador: use `throttle(update, 100)` como la función para ejecutar en cada movimiento del mouse en lugar del original `update()`. Se llamará al decorador con frecuencia, pero reenviará la llamada a `update()` como máximo una vez cada 100 ms.
26+
Entonces lo envolveremos en el decorador: para ejecutar en cada movimiento del mouse, usamos `throttle(update, 100)` en lugar del `update()` original. Se llamará al decorador con frecuencia, pero reenviará la llamada a `update()` como máximo una vez cada 100 ms.
2727

2828
Visualmente, se verá así:
2929

Diff for: 1-js/06-advanced-functions/09-call-apply-decorators/article.md

+17-18
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# Decoradores y redirecciones, call/apply
22

3-
JavaScript ofrece una flexibilidad excepcional cuando se trata de funciones. Se pueden pasar, usar como objetos, y ahora veremos cómo *redireccionar* las llamadas entre ellos y *decorarlos*.
3+
JavaScript ofrece una flexibilidad excepcional cuando se trata de funciones. Se pueden pasar, usar como objetos, y ahora veremos cómo *redirigir* las llamadas entre ellos y *decorarlos*.
44

55
## Caché transparente
66

77
Digamos que tenemos una función `slow(x)` que es pesada para la CPU, pero sus resultados son estables. En otras palabras, la misma `x` siempre devuelve el mismo resultado.
88

9-
Si la función se llama con frecuencia, es posible que queramos almacenar en caché (recordar) los resultados para evitar perder tiempo extra en los nuevos cálculos.
9+
Si la función se llama con frecuencia, es posible que queramos almacenar en caché (recordar) los resultados para evitar perder tiempo extra en nuevos cálculos.
1010

1111
Pero en lugar de agregar esa funcionalidad en `slow()` crearemos una función de contenedor, que agrega almacenamiento en caché. Como veremos, hacer esto trae beneficios.
1212

@@ -37,7 +37,7 @@ function cachingDecorator(func) {
3737
slow = cachingDecorator(slow);
3838

3939
alert( slow(1) ); // slow(1) es cacheado y se devuelve el resultado
40-
alert( "Again: " + slow(1) ); // el resultado slow(1) es devuelto desde cache
40+
alert( "Again: " + slow(1) ); // el resultado slow(1) es devuelto desde caché
4141

4242
alert( slow(2) ); // slow(2) es cacheado y devuelve el resultado
4343
alert( "Again: " + slow(2) ); // el resultado slow(2) es devuelto desde caché
@@ -58,7 +58,7 @@ Desde un código externo, la función `slow` envuelta sigue haciendo lo mismo. S
5858
Para resumir, hay varios beneficios de usar un `cachingDecorator` separado en lugar de alterar el código de `slow` en sí mismo:
5959

6060
- El `cachingDecorator` es reutilizable. Podemos aplicarlo a otra función.
61-
- La lógica de almacenamiento en caché es independiente, no aumentó la complejidad de `slow` en sí misma(si hubiera alguna).
61+
- La lógica de almacenamiento en caché es independiente, no aumentó la complejidad de `slow` en sí misma (si hubiera alguna).
6262
- Podemos combinar múltiples decoradores si es necesario.
6363

6464
## Usando "func.call" para el contexto
@@ -231,7 +231,7 @@ Anteriormente, para un solo argumento `x` podríamos simplemente usar `cache.set
231231
Hay muchas posibles soluciones:
232232

233233
1. Implemente una nueva estructura de datos similar a un mapa (o use una de un tercero) que sea más versátil y permita múltiples propiedades.
234-
2. Use mapas anidados `cache.set(min)` será un `Map` que almacena el par `(max, result)`. Para que podamos obtener `result` como `cache.get(min).get(max)`.
234+
2. Use mapas anidados: `cache.set(min)` será un `Map` que almacena el par `(max, result)`. Así podemos obtener `result` como `cache.get(min).get(max)`.
235235
3. Una dos valores en uno. En nuestro caso particular, podemos usar un string `"min,max"` como la propiedad de `Map`. Por flexibilidad, podemos permitir proporcionar un *función hashing* para el decorador, que sabe hacer un valor de muchos.
236236

237237
Para muchas aplicaciones prácticas, la tercera variante es lo suficientemente buena, por lo que nos mantendremos en esa opción.
@@ -382,22 +382,21 @@ Esto se debe a que el algoritmo interno del método nativo `arr.join (glue)` es
382382

383383
Tomado de la especificación casi "tal cual":
384384

385-
1. Deje que `glue` sea el primer argumento o, si no hay argumentos, entonces una coma `","`.
386-
2. Deje que `result` sea una cadena vacía.
387-
3. Agregue `this[0]` a `result`.
388-
4. Agregue `glue` y `this[1]`.
389-
5. Agregue `glue` y `this[2]`.
390-
6. ...hazlo hasta que los elementos `this.length` estén adheridos.
391-
7. Devuelva `result`.
385+
1. Hacer que `glue` sea el primer argumento o, si no hay argumentos, entonces una coma `","`.
386+
2. Hacer que `result` sea una cadena vacía.
387+
3. Adosar `this[0]` a `result`.
388+
4. Adherir `glue` y `this[1]`.
389+
5. Adherir `glue` y `this[2]`.
390+
6. ...hacerlo hasta que la cantidad `this.length` de elementos estén adheridos.
391+
7. Devolver `result`.
392392

393-
Entones, técnicamente `this` une `this[0]`, `this[1]` ...etc. Está escrito intencionalmente de una manera que permite cualquier tipo de array `this` (no es una coincidencia, muchos métodos siguen esta práctica). Es por eso que también funciona con `this = arguments`
393+
Entonces, técnicamente `this` une `this[0]`, `this[1]` ...etc. Está escrito intencionalmente de una manera que permite cualquier tipo de array `this` (no es una coincidencia, muchos métodos siguen esta práctica). Es por eso que también funciona con `this = arguments`
394394

395395
## Decoradores y propiedades de funciones
396396

397-
Por lo general, es seguro reemplazar una función o un método con un decorador, excepto por una pequeña cosa. Si la función original tenía propiedades, como `func.calledCount` o cualquier otra, entonces la función decoradora no las proporcionará. Porque eso es una envoltura. Por lo tanto, se debe tener cuidado al usarlo.
397+
Por lo general, es seguro reemplazar una función o un método con un decorador, excepto por una pequeña cosa. Si la función original tenía propiedades (como `func.calledCount` o cualquier otra) entonces la función decoradora no las proporcionará. Porque es una envoltura. Por lo tanto, se debe tener cuidado al usarlo.
398398

399-
400-
E.j. en el ejemplo anterior, si la función `slow` tenía propiedades, entonces `cachingDecorator(slow)` sería un contenedor, pero sin contener dichas propiedades.
399+
En el ejemplo anterior, si la función `slow` tuviera propiedades, `cachingDecorator(slow)` sería un contenedor sin dichas propiedades.
401400

402401
Algunos decoradores pueden proporcionar sus propias propiedades. P.ej. un decorador puede contar cuántas veces se invocó una función y cuánto tiempo tardó, y exponer esta información a través de propiedades de envoltura.
403402

@@ -422,6 +421,6 @@ let wrapper = function() {
422421
};
423422
```
424423

425-
También vimos un ejemplo de *préstamo de método* cuando tomamos un método de un objeto y lo `llamamos` en el contexto de otro objeto. Es bastante común tomar métodos de array y aplicarlos a `argumentos`. La alternativa es utilizar el objeto de parámetros rest que es un array real.
424+
También vimos un ejemplo de *préstamo de método* cuando tomamos un método de un objeto y lo `llamamos` en el contexto de otro objeto. Es bastante común tomar métodos de array y aplicarlos al símil-array `arguments`. La alternativa es utilizar el objeto de parámetros rest que es un array real.
426425

427-
Hay muchos decoradores a tu alrededor. Verifica si eres bueno resolviendo las tareas de este capítulo.
426+
Hay muchos decoradores a tu alrededor. Verifica qué tan bien los entendiste resolviendo las tareas de este capítulo.

0 commit comments

Comments
 (0)