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: README.md
+7Lines changed: 7 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,6 +10,13 @@
10
10
> – *Linus Torvalds*
11
11
12
12
13
+
### En otros idiomas
14
+
15
+
Este libro originalmente fue escrito en [español](https://leanpub.com/javascript-inspirate), pero ha sido traducido por la comunidad a los siguientes idiomas:
16
+
17
+
-[Gallego](https://leanpub.com/javascript-inspirate-gallego). Gracias a [Yoel Macia Delgado](https://github.com/ymdx)
18
+
19
+
13
20
### Acerca de este libro
14
21
15
22
#### Un libro de programación sencillo y divertido que nos muestra como programar en JavaScript desde cero.
Copy file name to clipboardExpand all lines: manuscript/capitulo1.txt
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -152,7 +152,7 @@ G> - *[Facebook en 2015](http://web.archive.org/web/20150731235552/https://faceb
152
152
153
153
## El largo camino del Developer
154
154
155
-
Este esquemático *[mapa mental](https://coggle.it/diagram/WF5nS6mGe9w7iwoZ)*, puede ayudaros a visualizar lo que esta ocurriendo hoy en día en la web, y comprender como los profesionales de la industria, hemos ido migrando de nombres y funciones hasta donde estamos ahora mismo, que no es definitivo y lógicamente seguirá evolucionando.
155
+
Este esquemático *[mapa mental](https://coggle.it/diagram/WF5nS6mGe9w7iwoZ)*, puede ayudaros a visualizar lo que está ocurriendo hoy en día en la web, y comprender como los profesionales de la industria, hemos ido migrando de nombres y funciones hasta donde estamos ahora mismo, que no es definitivo y lógicamente seguirá evolucionando.
T> Conversión array requiere de ciertos conocimientos avanzados en el uso de
269
-
T> *[protoype](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript)* y
269
+
T> *[prototype](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript)* y
270
270
T> *[this](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/this)*. Os
271
271
T> dejo una función que os ayudará a realizar esta conversión de una forma fácil.
272
272
T>
@@ -387,7 +387,7 @@ W> *linter* como *[JSHint](http://jshint.com/)* o *[ESLint](http://eslint.org/)*
387
387
388
388
## Funciones Anónimas
389
389
390
-
En JavaScript podemos crear tantas funciones como queramos, sin embargo entre los requisitos de creación no esta incluir un nombre necesariamente.
390
+
En JavaScript podemos crear tantas funciones como queramos, sin embargo entre los requisitos de creación no está incluir un nombre necesariamente.
391
391
392
392
### Funciones que retornan funciones
393
393
@@ -448,7 +448,7 @@ Lo contenido en el primer paréntesis contiene el código encapsulado, al igual
448
448
El segundo paréntesis es el encargado de ejecutar el bloque de código anterior, asi es como logramos que la función sea inmediatamente ejecutada dentro de un ámbito al que no podremos acceder.
449
449
450
450
451
-
Como podemos, ver la estructura básica sería algo así:
451
+
Como podemos ver, la estructura básica sería algo así:
452
452
453
453
{lang=js}
454
454
~~~~~~~
@@ -612,9 +612,9 @@ Veamos un ejemplo, un poco condensado. Os ayudaré comentando el código:
612
612
*/
613
613
var quieroCallback = function(p1, callback){
614
614
// Consideramos el callback como algo opcional.
615
-
if ((callback){
615
+
if (callback){
616
616
// Validamos si es una función o no.
617
-
if (typeof callback === 'function')){
617
+
if (typeof callback === 'function'){
618
618
/*
619
619
De ser una función lo ejecutamos y
620
620
y pasamos como argumento "p1"
@@ -644,7 +644,7 @@ I> **La naturaleza de la Asincronía**
644
644
I>
645
645
I> Hasta ahora todo el código que vimos se ejecutaba de una manera lógica,
646
646
I> previsible y secuencial.
647
-
I> Cada línea de código era ejecutada después de la anterior, tardará lo que tardrá.
647
+
I> Cada línea de código era ejecutada después de la anterior, tardará lo que tardará.
648
648
I> Este estilo de programación es ineficiente y bloqueante, lo que en el mundo de
649
649
I> la web es intolerable.
650
650
I>
@@ -653,7 +653,7 @@ I> ejecución en un segundo plano.
653
653
I> De tal forma que resulta imposible saber cuando terminarán y además antes de terminar su ejecucción se ejecutan la siguiente línea de código.
654
654
655
655
656
-
Cuando en JavaScript se habla de asincronía, lo que realmente esta ocurriendo es que dejamos de ejecutar partes de nuestro script de manera secuencial. Esto crea un efecto curioso que tiene como consecuencia, un script muy escalable y rápido, ya que el sistema no espera a que algo termine para seguir ejecutando el resto del script.
656
+
Cuando en JavaScript se habla de asincronía, lo que realmente está ocurriendo es que dejamos de ejecutar partes de nuestro script de manera secuencial. Esto crea un efecto curioso que tiene como consecuencia, un script muy escalable y rápido, ya que el sistema no espera a que algo termine para seguir ejecutando el resto del script.
657
657
658
658
I> La mala noticia, es que recaerá en el lector todo el peso de controlar esos caballos
659
659
I> desbocados.
@@ -756,7 +756,7 @@ traigoDatos(pintoDatos);
756
756
Algunas soluciones a este problema:
757
757
758
758
- No anidar en exceso... ¿Has oído hablar de la *[complejidad ciclomática](https://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tica)*?.
759
-
- Cualquier anidación de funciones a más de dos o tres niveles esta pidiendo a gritos una refactorización.
759
+
- Cualquier anidación de funciones a más de dos o tres niveles está pidiendo a gritos una refactorización.
760
760
- No todas las funciones de tu código han de ser anónimas...
761
761
- Modularizar y refactorizar son tus dos mejores amigos en JavaScript.
762
762
- Gestiona los errores en cada función y no al final de la pila.
Es un API que nos permite sacar gran cantidad de información sobre la máquina donde se esta ejecutando nuestro script. Incluso dispone de algunos métodos tan interesantes como *[Navigator.vibrate()](https://developer.mozilla.org/es/docs/Web/API/Navigator/vibrate)*, que permite hacer vibrar el dispositivo (siempre que sea compatible).
62
+
Es un API que nos permite sacar gran cantidad de información sobre la máquina donde se está ejecutando nuestro script. Incluso dispone de algunos métodos tan interesantes como *[Navigator.vibrate()](https://developer.mozilla.org/es/docs/Web/API/Navigator/vibrate)*, que permite hacer vibrar el dispositivo (siempre que sea compatible).
63
63
64
64
En el siguiente ejemplo, hacemos una lectura de gran información del sistema y además hacemos un par de cálculos interesantes para confirmar el nivel de batería.
65
65
66
-
En la línea 28 hemos utilizado una *[promesa](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promesa)*, ya que *[navigator.getBattery()](https://developer.mozilla.org/es/docs/Web/API/Navigator/getBattery) lo requiere así. Recuerda que esta es otra de las formas válidas, que existen para manejar la asincronía.*
66
+
En la línea 28 hemos utilizado una *[promesa](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promesa)*, ya que *[navigator.getBattery()](https://developer.mozilla.org/es/docs/Web/API/Navigator/getBattery) lo requiere así. Recuerda que ésta es otra de las formas válidas, que existen para manejar la asincronía.*
67
67
68
68
69
69
@@ -322,7 +322,7 @@ Veamos como se utilizan algunos selectores avanzados de CSS3:
322
322
323
323
{lang=css}
324
324
~~~~~~~
325
-
a[href*="leanpub"] {
325
+
a[href*="google.es"] {
326
326
color:orange;
327
327
}
328
328
~~~~~~~
@@ -726,7 +726,7 @@ Básicamente crearemos un objeto con los métodos *agregar* y *quitar* vacíos.
726
726
727
727
Es un poco más de trabajo de lo esperado, pero así es mucho mas sencillo gestionar nuestra aplicación, ya que nuestros métodos se adaptarán y no así nuestro código.
728
728
729
-
El valor añadido de usar este patrón esta, en que en un solo punto tomo una decisión que se extenderá por toda nuestra aplicación.
729
+
El valor añadido de usar este patrón está en que en un solo punto tomo una decisión que se extenderá por toda nuestra aplicación.
Copy file name to clipboardExpand all lines: manuscript/capitulo12.txt
+10-12Lines changed: 10 additions & 12 deletions
Original file line number
Diff line number
Diff line change
@@ -55,15 +55,13 @@ Estos códigos de estado pueden dividirse en cinco categorías principales:
55
55
Siendo especialmente importantes para nosotros, los 4xx y los 5xx, ya que nos indican errores que están sucediendo y esto seguramente derive en un tráfico de datos erróneo.
56
56
57
57
58
-
I> Aquí podéis encontrar la *[lista completa](https://es.wikipedia.
59
-
I> org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP)* y la *[especificación](https://tools.ietf.
60
-
I> org/html/rfc2616#section-10)*.
58
+
I> Aquí podéis encontrar la *[lista completa](https://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP)*
59
+
I> y la *[especificación](https://tools.ietf.org/html/rfc2616#section-10)*.
61
60
62
61
63
62
W> **Misterioso estado 418**
64
63
W>
65
-
W> Existen algunos códigos tan increíbles como *[418. I´m a teapot](http://www.josevazquez.net/codigo
66
-
W> -de-estado-http-418-i%C2%B4m-a-teapot/)*.
64
+
W> Existen algunos códigos tan increíbles como *[418. I´m a teapot](http://www.josevazquez.net/codigo-de-estado-http-418-i%C2%B4m-a-teapot/)*.
67
65
68
66
69
67
## Trabajando con APIs
@@ -84,8 +82,8 @@ Esto permite conseguir datos (peticiones GET), actualizar datos (peticiones PUT)
84
82
En la mayoría de los casos, el intercambio de información entre el cliente y servidor se realiza utilizando un formato de intercambio de datos conocido como JSON y no XML como antiguamente. De todo esto hablaremos a lo largo de este último capítulo.
85
83
86
84
87
-
I> Para ilustrar un poco el ejemplo, te invito a visitar *[jsonplaceholder](https://jsonplaceholder.
88
-
I> typicode.com/)* que es una especie de *[Lorem Ipsum](https://es.wikipedia.org/wiki/Lorem_ipsum)*
85
+
I> Para ilustrar un poco el ejemplo, te invito a visitar *[jsonplaceholder](https://jsonplaceholder.typicode.com/)*
86
+
I> que es una especie de *[Lorem Ipsum](https://es.wikipedia.org/wiki/Lorem_ipsum)*
89
87
I> para peticiones Ajax.
90
88
91
89
@@ -112,14 +110,14 @@ Petición DELETE a *api.loremblog.com/posts/hello*
112
110
113
111
114
112
I> Partiendo de esta filosofía, podremos atrevernos con muchas APIs, tan divertidas como [Twitter](
I> *[Spotify](https://developer.spotify.com/web-api/)* e incluso *[Yahoo!](https://developer.yahoo.com/everything.html)*
117
115
118
116
119
117
120
118
## Peticiones AJAX
121
119
122
-
Ya hemos visto que las peticiones Ajax son la esencia en la web de hoy, pero siempre que las utilicemos, debemos recordar, que nosotros somos consumidores/generadores de datos y que nuestra aplicación, esta dependiendo de manera permanente de otros sistemas.
120
+
Ya hemos visto que las peticiones Ajax son la esencia en la web de hoy, pero siempre que las utilicemos, debemos recordar, que nosotros somos consumidores/generadores de datos y que nuestra aplicación, está dependiendo de manera permanente de otros sistemas.
123
121
124
122
Esto quiere decir, que puede haber errores en su código, que hagan que las respuestas a nuestras peticiones no traigan los datos como esperamos. Por tanto, tendremos que hacer un esfuerzo adicional para validar todos los datos que recibimos. En ocasiones la documentación sobre la API, puede ser poco precisa o estar desfasada... dejándonos en una situación muy comprometida.
125
123
@@ -145,7 +143,7 @@ Respuesta 204
145
143
146
144
Respuesta 401
147
145
148
-
: *No autorizado*. Hemos olvidado utilizar el token. O nuestro token no esta correctamente configurado.
146
+
: *No autorizado*. Hemos olvidado utilizar el token. O nuestro token no está correctamente configurado.
149
147
150
148
151
149
Respuesta 403
@@ -318,7 +316,7 @@ Y por ello, cualquier petición que hagamos desde el navegador cliente no podrá
318
316
319
317
La mejor solución, es comunicarnos con los responsables de la API y facilitarles *[este link](http://enable-cors.org/index.html)*, donde *[Monsur Hossain](http://monsur.hossa.in/)* y *[Michael Hausenblas](http://mhausenblas.info/)*, explican como realizar las configuraciones adecuadas en muchos entornos.
320
318
321
-
Si por desgracia esta opción esta descartada, no pasa nada.... existen más posibilidades.
319
+
Si por desgracia esta opción está descartada, no pasa nada.... existen más posibilidades.
322
320
323
321
La primera y más útil es crear/configurar/usar un *[proxy](https://es.wikipedia.org/wiki/Servidor_proxy)*. La idea del proxy, es que realice una petición capturando esos datos y enviándolos de nuevo, teniendo CORS habilitado en la cabecera, de tal forma que podremos hacer peticiones Ajax, aunque tengamos que pasar por nuestro servidor.
Copy file name to clipboardExpand all lines: manuscript/capitulo2.txt
+4-4Lines changed: 4 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@ I> **Fiero veterano**
7
7
I>
8
8
I> En este capítulo, hablaremos sobre como es la computación y que se espera de un
9
9
I> desarrollador.
10
-
I> Si ya dominaís algun lenguaje de programación o sencillamente quiereís empezar ya mismo con JavaScript... pasad al siguiente capítulo.
10
+
I> Si ya dominaís algún lenguaje de programación o sencillamente queréis empezar ya mismo con JavaScript, pasad al siguiente capítulo.
11
11
12
12
13
13
## Un mundo de máquinas
@@ -163,7 +163,7 @@ Para que la lógica del sistema pueda decidir, necesitamos reducir todo a compar
163
163
- Operaciones lógicas
164
164
165
165
* La variable "nombreUsuario" es igual a "Pepe"
166
-
* La variable "nombreUsuario" no esta vacía
166
+
* La variable "nombreUsuario" no está vacía
167
167
168
168
169
169
A la hora de representar las opciones. *[PseInt](http://pseint.sourceforge.net/)* nos da dos opciones principales. La estructura *Si.. entonces* y *Según*, la diferencia en este contexto está en función del número de opciones.
@@ -272,7 +272,7 @@ Instrucciones
272
272
273
273
- **While (Mientras)**
274
274
275
-
Esta pensado para aquellos bucles que requieran de una condición lógica y no matemática para validar la iteracción.
275
+
Está pensado para aquellos bucles que requieran de una condición lógica y no matemática para validar la iteracción.
276
276
277
277
278
278
T> Aunque lógicamente podremos mezclar entre las diversas condiciones (matemáticas y lógicas).
@@ -306,7 +306,7 @@ Instrucciones
306
306
307
307
- **For (Para)**
308
308
309
-
Esta diseñado específicamente para trabajar con series de números (longitud de cadena, elementos de un array, propiedades de un objeto, etc...) y nos provee de una estructura más sencilla para gestionar el flujo.
309
+
Está diseñado específicamente para trabajar con series de números (longitud de cadena, elementos de un array, propiedades de un objeto, etc...) y nos provee de una estructura más sencilla para gestionar el flujo.
Copy file name to clipboardExpand all lines: manuscript/capitulo5.txt
+3-3Lines changed: 3 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -13,7 +13,7 @@ Para el caso que os preocupe el rendimiento de vuestros bucles os dejo *[este li
13
13
14
14
El primer bucle que veremos está específicamente diseñado para funcionar de manera constante, mientras una condición dada siga cumpliéndose.
15
15
16
-
Este bucle esta pensado para simplificarnos la sintaxis cuando el control del bucle no se realiza mediante operaciones matemáticas (mayor que... menor que...).
16
+
Este bucle está pensado para simplificarnos la sintaxis cuando el control del bucle no se realiza mediante operaciones matemáticas (mayor que... menor que...).
17
17
18
18
### Funcionamiento
19
19
@@ -240,7 +240,7 @@ for (var i = 0; i < 10; i++) {
240
240
241
241
### Exprimiendo el For
242
242
243
-
Si dominamos las tres partes básicas que componen el bucle *for*, podemos plantearnos estructuras tan complejas como esta.
243
+
Si dominamos las tres partes básicas que componen el bucle *for*, podemos plantearnos estructuras tan complejas como ésta.
244
244
245
245
{lang=js}
246
246
~~~~~~~
@@ -258,7 +258,7 @@ T> una buena práctica.
258
258
259
259
### No refactorizar
260
260
261
-
En ocasiones, el código evoluciona y no repasamos lo que habíamos construido previamente... llegando a situaciones tan monstruosas como esta.
261
+
En ocasiones, el código evoluciona y no repasamos lo que habíamos construido previamente... llegando a situaciones tan monstruosas como ésta.
0 commit comments