From 864c942dae9001a6a73ff8a2801b6569c3d3b647 Mon Sep 17 00:00:00 2001 From: Jose Cabrera Date: Sat, 2 Nov 2019 18:54:56 +0100 Subject: [PATCH 01/12] new-function: translate MD to spanish --- .../07-new-function/article.md | 97 +++++++++---------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index e0750e321..cc2ae6918 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -1,111 +1,108 @@ +# La sintáxis "new Function" -# The "new Function" syntax +Existe más de una manera de crear una función. Raramente usada, pero en ocasiones no tenemos otra alternativa. -There's one more way to create a function. It's rarely used, but sometimes there's no alternative. +## Sintáxis -## Syntax - -The syntax for creating a function: +La sintáxis para crear una función: ```js let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) ``` -In other words, function parameters (or, more precisely, names for them) go first, and the body is last. All arguments are strings. +En otras palabras, los parámetros de la función (o, para ser más precisos, los nomnres de los parámetros) van primero, y luego el cuerpo de la función. Todos los argumentos son de tipo strings -It's easier to understand by looking at an example. Here's a function with two arguments: +Es más fácil entender viendo un ejemplo: Aquí tenemos una función con dos argumentos: ```js run -let sum = new Function('a', 'b', 'return a + b'); +let sumar = new Function('a', 'b', 'return a + b'); -alert( sum(1, 2) ); // 3 +alert(sumar(1, 2)); // 3 ``` -If there are no arguments, then there's only a single argument, the function body: +Si no hay argumentos, entonces hay sólo un único argumento, el cuerpo de la función sería: ```js run -let sayHi = new Function('alert("Hello")'); +let diHola = new Function('alert("Hola")'); -sayHi(); // Hello +diHola(); // Hola ``` -The major difference from other ways we've seen is that the function is created literally from a string, that is passed at run time. +La mayor diferencia sobre las otras maneras de crear funciones que hemos visto, es que la función se crea literalmente con un string y es pasada en tiempo de ejecución. -All previous declarations required us, programmers, to write the function code in the script. +Las declaraciones anteriores nos obliga a nosotros, los programadores, a escribir el código de la función en el script. -But `new Function` allows to turn any string into a function. For example, we can receive a new function from a server and then execute it: +Pero `new Function` nos permite convertir cualquier string en una función. Por ejemplo, podemos recibir una nueva función desde el servidor y ejecutarlo. ```js -let str = ... receive the code from a server dynamically ... +let str = ... código proveniente del servidor de manera dinámica ... let func = new Function(str); func(); ``` -It is used in very specific cases, like when we receive code from a server, or to dynamically compile a function from a template. The need for that usually arises at advanced stages of development. +Se utilizan en situaciones muy específicas, por ejemplo cuando recibimos código desde un servidor, o compilar una función de manera dinámica partiendo de una plantilla. El uso surge en etapas avanzadas de desarrollo. ## Closure -Usually, a function remembers where it was born in the special property `[[Environment]]`. It references the Lexical Environment from where it's created. +Normalmente, una función recuerda dónde nació en una propiedad especial llamada `[[Environment]]`. Hace referencia al entorno léxico desde dónde se creó. -But when a function is created using `new Function`, its `[[Environment]]` references not the current Lexical Environment, but instead the global one. +Pero cuando función es creada usando `new Function`, su `[[Environment]]` no hace referencia al actual entorno léxico sino al global ```js run function getFunc() { - let value = "test"; + let valor = "test"; *!* - let func = new Function('alert(value)'); + let func = new Function('alert(valor)'); */!* return func; } -getFunc()(); // error: value is not defined +getFunc()(); // error: valor is not defined ``` -Compare it with the regular behavior: +Compáralo con el comportamiento normal: -```js run +```js run function getFunc() { - let value = "test"; + let valor = "test"; *!* - let func = function() { alert(value); }; + let func = function() { alert(valor); }; */!* return func; } -getFunc()(); // *!*"test"*/!*, from the Lexical Environment of getFunc +getFunc()(); // *!*"test"*/!*, obtenido del entorno léxico de getFunc ``` -This special feature of `new Function` looks strange, but appears very useful in practice. - -Imagine that we must create a function from a string. The code of that function is not known at the time of writing the script (that's why we don't use regular functions), but will be known in the process of execution. We may receive it from the server or from another source. +Esta característica especial de `new Function` parece estraño, pero parece muy útil en la práctica. -Our new function needs to interact with the main script. +Imagina que debemos crear una funcion apartir de una string. El código de dicha función no se conoce al momento de escribir el script (es por eso que no usamos funciones regulares), pero se conocerá en el proceso de ejecución. Podemos recibirlo del servidor o de otra fuente. -Perhaps we want it to be able to access outer local variables? +¿Quizás queremos que pueda acceder a las variables locales externas? -The problem is that before JavaScript is published to production, it's compressed using a *minifier* -- a special program that shrinks code by removing extra comments, spaces and -- what's important, renames local variables into shorter ones. +El problema es que antes de publicar el JavaScript a producción, este es comprimido usando un _minifier_ -- un programa especial que comprime código elimiando los comentarios extras, espacios -- y lo que es más importante, renombra las variables locales a otras más cortas. -For instance, if a function has `let userName`, minifier replaces it `let a` (or another letter if this one is occupied), and does it everywhere. That's usually a safe thing to do, because the variable is local, nothing outside the function can access it. And inside the function, minifier replaces every mention of it. Minifiers are smart, they analyze the code structure, so they don't break anything. They're not just a dumb find-and-replace. +Por ejemplo, si una función tiene `let userName`, el _minifier_ lo reemplaza a `let a` (o otra letra si esta está siendo utilizada), y lo hace en todas partes. Esto es normalmente una práctica segura, al ser una variable local, nada de fuera de la función puede acceder a ella. Y dentro de una función, el _minifier_ reemplaza todo lo que le menciona. Los Minificadores son inteligiente, ellos analizan la estructura del código, por lo tanto, no rompen nada. No realizan un simple buscar y reemplazar. -But, if `new Function` could access outer variables, then it would be unable to find `userName`, since this is passed in as a string *after* the code is minified. +Pero, si `new Function` puede acceder a las variables externas, entonces no podría encontrar `userName`, ya que esto es pasada como un string _después_ de que el código haya sido minificado. -**Even if we could access outer lexical environment in `new Function`, we would have problems with minifiers.** +**Incluso si podemos acceder al entorno léxico con `new Function`, tendríamos problemas con los minificadores** -The "special feature" of `new Function` saves us from mistakes. +La "característica especial" de `new Function` nos salva de errores. -And it enforces better code. If we need to pass something to a function created by `new Function`, we should pass it explicitly as an argument. +Y obliga a un mejor código. Si necesitamos pasarle algo a la función creada con `new Function`, debemos pasarle explícitamente como argumento. -Our "sum" function actually does that right: +Nuestra función "suma" lo hace bien: -```js run +```js run *!* -let sum = new Function('a', 'b', 'return a + b'); +let suma = new Function('a', 'b', 'return a + b'); */!* let a = 1, b = 2; @@ -116,22 +113,22 @@ alert( sum(a, b) ); // 3 */!* ``` -## Summary +## Resumen -The syntax: +La sintáxis: ```js let func = new Function(arg1, arg2, ..., body); ``` -For historical reasons, arguments can also be given as a comma-separated list. +Por razones históricas, los argumentos también pueden ser pasados como una lista separada por comas. -These three mean the same: +Estos tres significan lo mismo: -```js -new Function('a', 'b', 'return a + b'); // basic syntax -new Function('a,b', 'return a + b'); // comma-separated -new Function('a , b', 'return a + b'); // comma-separated with spaces +```js +new Function('a', 'b', 'return a + b'); // sintáxis básica +new Function('a,b', 'return a + b'); // separados por coma +new Function('a , b', 'return a + b'); // separados por coma y espacios ``` -Functions created with `new Function`, have `[[Environment]]` referencing the global Lexical Environment, not the outer one. Hence, they cannot use outer variables. But that's actually good, because it saves us from errors. Passing parameters explicitly is a much better method architecturally and causes no problems with minifiers. +Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasándolo parámetros de manera explícita es un método arquitectónico mejor y no provoca problemas con los minificadores. From ad45108568251599d6de4617db41c847231522f9 Mon Sep 17 00:00:00 2001 From: Jose Cabrera Date: Mon, 25 Nov 2019 21:08:46 +0100 Subject: [PATCH 02/12] new-function: fix some typo issues --- 1-js/06-advanced-functions/07-new-function/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index cc2ae6918..569d6662c 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -10,7 +10,7 @@ La sintáxis para crear una función: let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) ``` -En otras palabras, los parámetros de la función (o, para ser más precisos, los nomnres de los parámetros) van primero, y luego el cuerpo de la función. Todos los argumentos son de tipo strings +En otras palabras, los parámetros de la función (o, para ser más precisos, los nombres de los parámetros) van primero, y luego el cuerpo de la función. Todos los argumentos son de tipo strings Es más fácil entender viendo un ejemplo: Aquí tenemos una función con dos argumentos: @@ -35,19 +35,19 @@ Las declaraciones anteriores nos obliga a nosotros, los programadores, a escribi Pero `new Function` nos permite convertir cualquier string en una función. Por ejemplo, podemos recibir una nueva función desde el servidor y ejecutarlo. ```js -let str = ... código proveniente del servidor de manera dinámica ... +let str = ... recibir el código de un servidor dinámicamente ... let func = new Function(str); func(); ``` -Se utilizan en situaciones muy específicas, por ejemplo cuando recibimos código desde un servidor, o compilar una función de manera dinámica partiendo de una plantilla. El uso surge en etapas avanzadas de desarrollo. +Se utilizan en casos muy específicos, como cuando recibimos código de un servidor, o compilar dinámicamente una función a partir de una plantilla. La necesidad surge en etapas avanzadas de desarrollo. ## Closure Normalmente, una función recuerda dónde nació en una propiedad especial llamada `[[Environment]]`. Hace referencia al entorno léxico desde dónde se creó. -Pero cuando función es creada usando `new Function`, su `[[Environment]]` no hace referencia al actual entorno léxico sino al global +Pero cuando una función es creada usando `new Function`, su `[[Environment]]` no hace referencia al entorno léxico actual, sino al global. ```js run @@ -131,4 +131,4 @@ new Function('a,b', 'return a + b'); // separados por coma new Function('a , b', 'return a + b'); // separados por coma y espacios ``` -Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasándolo parámetros de manera explícita es un método arquitectónico mejor y no provoca problemas con los minificadores. +Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasar parámetros explícitamente es un método mucho mejor arquitectónicamente y no provoca problemas con los minificadores. From ae90bc2a2d21cd842d31e6ef172f469f8f444cca Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:51:06 -0300 Subject: [PATCH 03/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index 39abc83f4..b00288694 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -1,4 +1,4 @@ -# La sintáxis "new Function" +# La sintaxis "new Function" Existe más de una manera de crear una función. Raramente usada, pero en ocasiones no tenemos otra alternativa. @@ -128,4 +128,3 @@ new Function('a , b', 'return a + b'); // separados por coma y espacios ``` Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasar parámetros explícitamente es un método mucho mejor arquitectónicamente y no provoca problemas con los minificadores. - From dd2618ce84c5efe19acffd51407608c54d863157 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:51:22 -0300 Subject: [PATCH 04/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index b00288694..e10308718 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -1,6 +1,6 @@ # La sintaxis "new Function" -Existe más de una manera de crear una función. Raramente usada, pero en ocasiones no tenemos otra alternativa. +Hay una forma más de crear una función. Raramente se usa, pero a veces no hay alternativa. ## Sintáxis From 1c95fe2e107bd7ba6bca2d5bbe76ac93b84210c5 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:51:36 -0300 Subject: [PATCH 05/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index e10308718..e30fe6ae2 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -2,7 +2,7 @@ Hay una forma más de crear una función. Raramente se usa, pero a veces no hay alternativa. -## Sintáxis +## Sintaxis La sintáxis para crear una función: From 3f738d9f08c3de210fac0224a48a33b1d4c97e71 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:51:46 -0300 Subject: [PATCH 06/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index e30fe6ae2..8a38930b3 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -4,7 +4,7 @@ Hay una forma más de crear una función. Raramente se usa, pero a veces no hay ## Sintaxis -La sintáxis para crear una función: +La sintaxis para crear una función: ```js let func = new Function ([arg1, arg2, ...argN], functionBody); From 431bb77efd4cf9b4251f32683da494cda05c26b3 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:52:09 -0300 Subject: [PATCH 07/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index 8a38930b3..bab6b89d8 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -10,7 +10,7 @@ La sintaxis para crear una función: let func = new Function ([arg1, arg2, ...argN], functionBody); ``` -En otras palabras, los parámetros de la función (o, para ser más precisos, los nombres de los parámetros) van primero, y luego el cuerpo de la función. Todos los argumentos son de tipo strings +La función se crea con los argumentos `arg1 ... argN` y el `functionBody` dado. Es más fácil entender viendo un ejemplo: Aquí tenemos una función con dos argumentos: From 244f96670d025f9ca336a328afda9844f4c5fe75 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:53:08 -0300 Subject: [PATCH 08/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index bab6b89d8..16c833f11 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -123,7 +123,6 @@ Estos tres significan lo mismo: ```js new Function('a', 'b', 'return a + b'); // sintáxis básica -new Function('a,b', 'return a + b'); // separados por coma new Function('a , b', 'return a + b'); // separados por coma y espacios ``` From 85c2e8062887d5cda7d42c6834ba58ca8e607c58 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:53:19 -0300 Subject: [PATCH 09/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index 16c833f11..347cda6b4 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -123,7 +123,6 @@ Estos tres significan lo mismo: ```js new Function('a', 'b', 'return a + b'); // sintáxis básica -new Function('a , b', 'return a + b'); // separados por coma y espacios ``` Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasar parámetros explícitamente es un método mucho mejor arquitectónicamente y no provoca problemas con los minificadores. From 62972aae5b1f6351f331c46d622dc8df49736448 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:53:27 -0300 Subject: [PATCH 10/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index 347cda6b4..cd3104d84 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -123,6 +123,5 @@ Estos tres significan lo mismo: ```js new Function('a', 'b', 'return a + b'); // sintáxis básica -``` Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasar parámetros explícitamente es un método mucho mejor arquitectónicamente y no provoca problemas con los minificadores. From 1eedddaa0773b1304f32126e68fb76aa11616a78 Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:53:36 -0300 Subject: [PATCH 11/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index cd3104d84..53d48228c 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -123,5 +123,4 @@ Estos tres significan lo mismo: ```js new Function('a', 'b', 'return a + b'); // sintáxis básica - Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasar parámetros explícitamente es un método mucho mejor arquitectónicamente y no provoca problemas con los minificadores. From 085977234507337d8d5e16f37e89bb05696cacad Mon Sep 17 00:00:00 2001 From: Ezequiel Castellanos <51804994+ezzep66@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:53:46 -0300 Subject: [PATCH 12/12] Update 1-js/06-advanced-functions/07-new-function/article.md --- 1-js/06-advanced-functions/07-new-function/article.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/06-advanced-functions/07-new-function/article.md b/1-js/06-advanced-functions/07-new-function/article.md index 53d48228c..1909a36de 100644 --- a/1-js/06-advanced-functions/07-new-function/article.md +++ b/1-js/06-advanced-functions/07-new-function/article.md @@ -123,4 +123,3 @@ Estos tres significan lo mismo: ```js new Function('a', 'b', 'return a + b'); // sintáxis básica -Las funciones creadas con `new Function`, tienen un `[[Environment]]` que hace referencia al entorno léxico global, no al exterior. Por lo tanto, no pueden usar las variables externas. Pero en realidad eso es bueno, porque nos salva de errores. Pasar parámetros explícitamente es un método mucho mejor arquitectónicamente y no provoca problemas con los minificadores.