From b70f45cbaf07c2f56579ae9d8621662ab7a25507 Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 03:49:42 -0300 Subject: [PATCH 1/9] 1-99-2 eval --- .../02-eval/1-eval-calculator/solution.md | 8 +-- .../02-eval/1-eval-calculator/task.md | 6 +- 1-js/99-js-misc/02-eval/article.md | 68 +++++++++---------- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md index 24d40c9b8..898439525 100644 --- a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md +++ b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md @@ -1,11 +1,11 @@ -Let's use `eval` to calculate the maths expression: +Usemos `eval` para calcula la expresión matemática: ```js demo run -let expr = prompt("Type an arithmetic expression?", '2*3+2'); +let expr = prompt("Escribe una expresión matemática:", '2*3+2'); alert( eval(expr) ); ``` -The user can input any text or code though. +Pero el usuario puede ingresar cualquier texto o código. -To make things safe, and limit it to arithmetics only, we can check the `expr` using a [regular expression](info:regular-expressions), so that it only may contain digits and operators. +Para hacer las cosas seguras, y limitarlo a aritmética solamente, podemos verificar `expr` usando una [expresión regular](info:regular-expressions) que solo pueda contener dígitos y operandos. diff --git a/1-js/99-js-misc/02-eval/1-eval-calculator/task.md b/1-js/99-js-misc/02-eval/1-eval-calculator/task.md index ece43ec9e..d26c7e712 100644 --- a/1-js/99-js-misc/02-eval/1-eval-calculator/task.md +++ b/1-js/99-js-misc/02-eval/1-eval-calculator/task.md @@ -2,10 +2,10 @@ importance: 4 --- -# Eval-calculator +# Calculadora-eval -Create a calculator that prompts for an arithmetic expression and returns its result. +Crea una calculadora que pida una expresión aritmética y devuelva su resultado. -There's no need to check the expression for correctness in this task. Just evaluate and return the result. +No es necesario verificar que la expresión sea correcta en esta tarea. Simplemente que evalue y devuelva el resultado. [demo] diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index 1fdafeeec..9100d80d2 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -1,25 +1,25 @@ -# Eval: run a code string +# Eval: ejecutando una cadena de código -The built-in `eval` function allows to execute a string of code. +La función incorporada `eval` permite ejecutar una cadena de código. -The syntax is: +La sintaxis es: ```js let result = eval(code); ``` -For example: +Por ejemplo: ```js run let code = 'alert("Hello")'; eval(code); // Hello ``` -A string of code may be long, contain line breaks, function declarations, variables and so on. +Una cadena de código puede ser larga, contener cortes de línea, declaración de funciones, variables y así. -The result of `eval` is the result of the last statement. +El resultado de `eval` es el resultado de la última sentencia. -For example: +Por ejemplo: ```js run let value = eval('1+1'); alert(value); // 2 @@ -30,7 +30,7 @@ let value = eval('let i = 0; ++i'); alert(value); // 1 ``` -The eval'ed code is executed in the current lexical environment, so it can see outer variables: +El código evaluado es ejecutado en el entorno léxico presente, entonces podemos ver sus variables externas: ```js run no-beautify let a = 1; @@ -46,56 +46,56 @@ function f() { f(); ``` -It can change outer variables as well: +Puede también cambiar variables externas: ```js untrusted refresh run let x = 5; eval("x = 10"); -alert(x); // 10, value modified +alert(x); // 10, valor modificado ``` -In strict mode, `eval` has its own lexical environment. So functions and variables, declared inside eval, are not visible outside: +En modo estricto, `eval` tiene su propio entorno léxico. Entonces funciones y variables declaradas dentro de eval no son visibles fuera: ```js untrusted refresh run -// reminder: 'use strict' is enabled in runnable examples by default +// recordatorio: 'use strict' está habilitado en los ejemplos ejecutables por defecto eval("let x = 5; function f() {}"); -alert(typeof x); // undefined (no such variable) -// function f is also not visible +alert(typeof x); // undefined (no existe tal variable) +// la función f tampoco es visible ``` -Without `use strict`, `eval` doesn't have its own lexical environment, so we would see `x` and `f` outside. +Sin `use strict`, `eval` no tiene su propio entorno léxico, entonces podemos ver `x` y `f` afuera. -## Using "eval" +## Usando "eval" -In modern programming `eval` is used very sparingly. It's often said that "eval is evil". +En programación moderna `eval` es usado muy ocasionalmente. Se suele decir que "eval es diabólico". -The reason is simple: long, long time ago JavaScript was a much weaker language, many things could only be done with `eval`. But that time passed a decade ago. +La razón es simple: largo, largo tiempo atrás JavaScript era un lenguaje mucho más débil, muchas cosas podían ser concretadas solamente con `eval`. Pero aquel tiempo pasó hace una década. -Right now, there's almost no reason to use `eval`. If someone is using it, there's a good chance they can replace it with a modern language construct or a [JavaScript Module](info:modules). +Ahora no hay casi razón para usar `eval`. Si alguien lo está usando, hay buena chance de que pueda ser reemplazado con una construcción moderna del lenguaje o un [Módulo JavaScript](info:modules). -Please note that its ability to access outer variables has side-effects. +Por favor ten en cuenta que su habilidad para acceder variables externas tiene efectos colaterales. -Code minifiers (tools used before JS gets to production, to compress it) rename local variables into shorter ones (like `a`, `b` etc) to make the code smaller. That's usually safe, but not if `eval` is used, as local variables may be accessed from eval'ed code string. So minifiers don't do that renaming for all variables potentially visible from `eval`. That negatively affects code compression ratio. +Los Code minifiers (minimizadores de código, herramientas usadas antes de poner JS en producción para comprimirlo) renombran las variables locales acortándolas (como `a`, `b` etc) para achicar el código. Usualmente esto es seguro, pero no si `eval` es usado porque las variables locales puden ser accedidas desde la cadena de código evaluada. Por ello los minimizadores no hacen tal renombado en todas las variables potencialmente visibles por `eval`. Esto afecta negativamente en el índice de compresión. -Using outer local variables inside `eval` is also considered a bad programming practice, as it makes maintaining the code more difficult. +El uso de variables locales dentro de `eval` es también considerado una mala práctica de programación, porque hace el mantenimiento de código más difícil. -There are two ways how to be totally safe from such problems. +Hay dos maneras de estar asegurado frente a tales problemas. -**If eval'ed code doesn't use outer variables, please call `eval` as `window.eval(...)`:** +**Si el código evaluado no usa variables externas, por favor llama `eval` como `window.eval(...)`:** -This way the code is executed in the global scope: +De esta manera el código es ejecutado en el entorno global: ```js untrusted refresh run let x = 1; { let x = 5; - window.eval('alert(x)'); // 1 (global variable) + window.eval('alert(x)'); // 1 (variable global) } ``` -**If eval'ed code needs local variables, change `eval` to `new Function` and pass them as arguments:** +**Si el código evaluado necesita variables locales, cambia `eval` por `new Function` y pásalas como argumentos:** ```js run let f = new Function('a', 'alert(a)'); @@ -103,12 +103,12 @@ let f = new Function('a', 'alert(a)'); f(5); // 5 ``` -The `new Function` construct is explained in the chapter . It creates a function from a string, also in the global scope. So it can't see local variables. But it's so much clearer to pass them explicitly as arguments, like in the example above. +La contrucción `new Function` es explicada en el capítulo . Esta crea una función desde una cadena, también en el entorno global, y así no puede ver las variables locales. Pero es mucho más claro pasarlas explícitamente como argumentos como en el ejemplo de arriba. -## Summary +## Resumen -A call to `eval(code)` runs the string of code and returns the result of the last statement. -- Rarely used in modern JavaScript, as there's usually no need. -- Can access outer local variables. That's considered bad practice. -- Instead, to `eval` the code in the global scope, use `window.eval(code)`. -- Or, if your code needs some data from the outer scope, use `new Function` and pass it as arguments. +Un llamado a `eval(code)` ejecuta la cadena de código y devuelve el resultado de la última sentencia. +- Es raramente usado en JavaScript moderno, y usualmente no es necesario. +- Puede acceder a variables locales externas. Esto es considerado una mala práctica. +- En su lugar, para evaluar el código en el entorno global, usa `window.eval(code)`. +- O, si tu código necesita algunos datos de el entorno externo, usa `new Function` y pásalos como argumentos. From e7900562665e98a69fdd82d984a09167c93a9aae Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 03:59:04 -0300 Subject: [PATCH 2/9] Update article.md --- 1-js/99-js-misc/02-eval/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index 9100d80d2..91a7a9a13 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -46,7 +46,7 @@ function f() { f(); ``` -Puede también cambiar variables externas: +Puede también modificar variables externas: ```js untrusted refresh run let x = 5; From c4ef4658ab65f2cfc19564d7ba1b4f40f96086ce Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 13:56:22 -0300 Subject: [PATCH 3/9] Update 1-js/99-js-misc/02-eval/1-eval-calculator/solution.md UH!! Estoy desolado. Pero gracias. Co-authored-by: Maksumi Murakami --- 1-js/99-js-misc/02-eval/1-eval-calculator/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md index 898439525..95337a505 100644 --- a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md +++ b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md @@ -1,4 +1,4 @@ -Usemos `eval` para calcula la expresión matemática: +Usemos `eval` para calcular la expresión matemática: ```js demo run let expr = prompt("Escribe una expresión matemática:", '2*3+2'); From dc392a01a921d5af0bbeb471e87fcca46512b43a Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 14:06:24 -0300 Subject: [PATCH 4/9] Update solution.md --- 1-js/99-js-misc/02-eval/1-eval-calculator/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md index 95337a505..8ab75a575 100644 --- a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md +++ b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md @@ -6,6 +6,6 @@ let expr = prompt("Escribe una expresión matemática:", '2*3+2'); alert( eval(expr) ); ``` -Pero el usuario puede ingresar cualquier texto o código. +Aunque el usuario puede ingresar cualquier texto o código. Para hacer las cosas seguras, y limitarlo a aritmética solamente, podemos verificar `expr` usando una [expresión regular](info:regular-expressions) que solo pueda contener dígitos y operandos. From 0fc1688556d3ffee2f728c8a91fc61db8fe3eff8 Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 14:11:16 -0300 Subject: [PATCH 5/9] Update 1-js/99-js-misc/02-eval/1-eval-calculator/solution.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No, no más claridad, más corrección. Operando es el miembro, operador es el signo. Good catch diria un yanqui. Co-authored-by: Maksumi Murakami --- 1-js/99-js-misc/02-eval/1-eval-calculator/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md index 8ab75a575..16e05075d 100644 --- a/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md +++ b/1-js/99-js-misc/02-eval/1-eval-calculator/solution.md @@ -8,4 +8,4 @@ alert( eval(expr) ); Aunque el usuario puede ingresar cualquier texto o código. -Para hacer las cosas seguras, y limitarlo a aritmética solamente, podemos verificar `expr` usando una [expresión regular](info:regular-expressions) que solo pueda contener dígitos y operandos. +Para hacer las cosas seguras, y limitarlo a aritmética solamente, podemos verificar `expr` usando una [expresión regular](info:regular-expressions) que solo pueda contener dígitos y operadores. From d3125a1d7eda284522b3ebe28df7b0bfface1c1c Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 14:11:31 -0300 Subject: [PATCH 6/9] Update 1-js/99-js-misc/02-eval/article.md Co-authored-by: Maksumi Murakami --- 1-js/99-js-misc/02-eval/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index 91a7a9a13..0c44b79b8 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -46,7 +46,7 @@ function f() { f(); ``` -Puede también modificar variables externas: +También puede modificar variables externas: ```js untrusted refresh run let x = 5; From f9641fac8957b69f8848b2c93bf3e4bc13f8fdf6 Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 14:14:23 -0300 Subject: [PATCH 7/9] Update 1-js/99-js-misc/02-eval/article.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jugué un poco, me pareció diabolico mas que "el diablo" Malvado me gusta mas ahora,,, estuve tentado a poner "malito" tambien, una chiquilinada. Co-authored-by: Maksumi Murakami --- 1-js/99-js-misc/02-eval/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index 0c44b79b8..67ce271ec 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -69,7 +69,7 @@ Sin `use strict`, `eval` no tiene su propio entorno léxico, entonces podemos ve ## Usando "eval" -En programación moderna `eval` es usado muy ocasionalmente. Se suele decir que "eval es diabólico". +En programación moderna `eval` es usado muy ocasionalmente. Se suele decir que "eval is evil" - juego de palabras en inglés que significa en español: "eval es malvado". La razón es simple: largo, largo tiempo atrás JavaScript era un lenguaje mucho más débil, muchas cosas podían ser concretadas solamente con `eval`. Pero aquel tiempo pasó hace una década. From cfc3adfb7322acf237adb6636475b7a10c95f2c7 Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 14:15:41 -0300 Subject: [PATCH 8/9] Update 1-js/99-js-misc/02-eval/article.md el plural me da igual, pero la fluidez mejoro mucho Co-authored-by: Maksumi Murakami --- 1-js/99-js-misc/02-eval/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index 67ce271ec..ad4b45b05 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -73,7 +73,7 @@ En programación moderna `eval` es usado muy ocasionalmente. Se suele decir que La razón es simple: largo, largo tiempo atrás JavaScript era un lenguaje mucho más débil, muchas cosas podían ser concretadas solamente con `eval`. Pero aquel tiempo pasó hace una década. -Ahora no hay casi razón para usar `eval`. Si alguien lo está usando, hay buena chance de que pueda ser reemplazado con una construcción moderna del lenguaje o un [Módulo JavaScript](info:modules). +Ahora casi no hay razones para usar `eval`. Si alguien lo está usando, hay buena chance de que pueda ser reemplazado con una construcción moderna del lenguaje o un [Módulo JavaScript](info:modules). Por favor ten en cuenta que su habilidad para acceder variables externas tiene efectos colaterales. From 9f5e957b47f975fad8ac5082bb81a67398913fbf Mon Sep 17 00:00:00 2001 From: joaquinelio Date: Wed, 15 Jul 2020 14:16:47 -0300 Subject: [PATCH 9/9] Update 1-js/99-js-misc/02-eval/article.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UUUHHH El peligro de empezar a asemejarsse al inglés, la falta de conectores. Co-authored-by: Maksumi Murakami --- 1-js/99-js-misc/02-eval/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index ad4b45b05..5622bc3dd 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -75,7 +75,7 @@ La razón es simple: largo, largo tiempo atrás JavaScript era un lenguaje mucho Ahora casi no hay razones para usar `eval`. Si alguien lo está usando, hay buena chance de que pueda ser reemplazado con una construcción moderna del lenguaje o un [Módulo JavaScript](info:modules). -Por favor ten en cuenta que su habilidad para acceder variables externas tiene efectos colaterales. +Por favor ten en cuenta que su habilidad para acceder a variables externas tiene efectos colaterales. Los Code minifiers (minimizadores de código, herramientas usadas antes de poner JS en producción para comprimirlo) renombran las variables locales acortándolas (como `a`, `b` etc) para achicar el código. Usualmente esto es seguro, pero no si `eval` es usado porque las variables locales puden ser accedidas desde la cadena de código evaluada. Por ello los minimizadores no hacen tal renombado en todas las variables potencialmente visibles por `eval`. Esto afecta negativamente en el índice de compresión.