You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/09-call-apply-decorators/02-delay/solution.md
+1-1
Original file line number
Diff line number
Diff line change
@@ -14,7 +14,7 @@ let f1000 = delay(alert, 1000);
14
14
f1000("test"); // mostrar "test" después de 1000ms
15
15
```
16
16
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.
18
18
19
19
Si pasamos una función regular, `setTimeout` lo llamaría sin argumentos y `this = window` (suponiendo que estemos en el navegador).
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/task.md
+2-2
Original file line number
Diff line number
Diff line change
@@ -16,14 +16,14 @@ En otras palabras, "throttle" es como una secretaria que acepta llamadas telefó
16
16
17
17
Revisemos una aplicación de la vida real para comprender mejor ese requisito y ver de dónde proviene.
18
18
19
-
**Por ejemplo, queremos rastrear los movimientos del mouse.**
19
+
**Por ejemplo, queremos registrar los movimientos del mouse.**
20
20
21
21
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).
22
22
**Nos gustaría actualizar cierta información en la página web cuando se mueve el puntero.**
23
23
24
24
...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.
25
25
26
-
Entonces lo envolveremos en el decorador: use `throttle(update, 100)` como la función para ejecutar en cada movimiento del mouseen 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.
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/09-call-apply-decorators/article.md
+17-18
Original file line number
Diff line number
Diff line change
@@ -1,12 +1,12 @@
1
1
# Decoradores y redirecciones, call/apply
2
2
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*.
4
4
5
5
## Caché transparente
6
6
7
7
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.
8
8
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.
10
10
11
11
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.
12
12
@@ -37,7 +37,7 @@ function cachingDecorator(func) {
37
37
slow =cachingDecorator(slow);
38
38
39
39
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é
41
41
42
42
alert( slow(2) ); // slow(2) es cacheado y devuelve el resultado
43
43
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
58
58
Para resumir, hay varios beneficios de usar un `cachingDecorator` separado en lugar de alterar el código de `slow` en sí mismo:
59
59
60
60
- 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).
62
62
- Podemos combinar múltiples decoradores si es necesario.
63
63
64
64
## Usando "func.call" para el contexto
@@ -231,7 +231,7 @@ Anteriormente, para un solo argumento `x` podríamos simplemente usar `cache.set
231
231
Hay muchas posibles soluciones:
232
232
233
233
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)`.
235
235
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.
236
236
237
237
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
382
382
383
383
Tomado de la especificación casi "tal cual":
384
384
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`.
392
392
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`
394
394
395
395
## Decoradores y propiedades de funciones
396
396
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.
398
398
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.
401
400
402
401
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.
403
402
@@ -422,6 +421,6 @@ let wrapper = function() {
422
421
};
423
422
```
424
423
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.
426
425
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