From 33eba5d1316bef26fdec2dec2089101d87aae4f3 Mon Sep 17 00:00:00 2001 From: Andrea Longo Date: Sun, 7 Mar 2021 11:30:15 +0100 Subject: [PATCH 1/3] translate article and tasks --- .../02-eval/1-eval-calculator/solution.md | 6 +- .../02-eval/1-eval-calculator/task.md | 4 +- 1-js/99-js-misc/02-eval/article.md | 68 +++++++++---------- 3 files changed, 39 insertions(+), 39 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..9c200ebbe 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 @@ -Let's use `eval` to calculate the maths expression: +Utilizziamo `eval` per risolvere l'espressione matematica: ```js demo run let expr = prompt("Type an arithmetic expression?", '2*3+2'); @@ -6,6 +6,6 @@ let expr = prompt("Type an arithmetic expression?", '2*3+2'); alert( eval(expr) ); ``` -The user can input any text or code though. +L'utente può inserire qualsiasi testo o codice. -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. +Per rendere tutto più sicuro, limitiamo ai soli caratteri aritmetici, possiamo verificare `expr` utilizzando un'[espressione regolare](info:regular-expressions), in questo modo potrà contenere solamente cifre e operatori. 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..00b9aa689 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 @@ -4,8 +4,8 @@ importance: 4 # Eval-calculator -Create a calculator that prompts for an arithmetic expression and returns its result. +Create una calcolatrice che richiede all'utente (tramite prompt) un'espressione aritmetica e ne ritorni il risultato. -There's no need to check the expression for correctness in this task. Just evaluate and return the result. +Non c'è alcun bisogno di testare la correttezza dell'espressione. Limitatevi ad eseguirla e ritornarne il risultato. [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..199940e2d 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: eseguire una stringa di codice -The built-in `eval` function allows to execute a string of code. +La funzione integrata `eval` consente di eseguire stringhe di codice. -The syntax is: +La sintassi da utilizzare è: ```js let result = eval(code); ``` -For example: +Ad esempio: ```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 stringa di codice potrebbe essere molto lunga, potrebbe contenere interruzioni di riga, dichiarazioni di funzione, variabili e cosi via. -The result of `eval` is the result of the last statement. +Il risultato ritornato da `eval` corrisponde a quello dell'ultima istruzione. -For example: +Ad esempio: ```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: +Il codice valutato viene eseguito nel lexical environment corrente, quindi può accedere alle variabili esterne: ```js run no-beautify let a = 1; @@ -46,56 +46,56 @@ function f() { f(); ``` -It can change outer variables as well: +Può quindi modificare le variabili esterne: ```js untrusted refresh run let x = 5; eval("x = 10"); -alert(x); // 10, value modified +alert(x); // 10, valore modificato ``` -In strict mode, `eval` has its own lexical environment. So functions and variables, declared inside eval, are not visible outside: +In strict mode, `eval` viene eseguito in un lexical environment separato. Quindi le funzioni e le variabili dichiarate internamente, non sono visibili all'esterno: ```js untrusted refresh run -// reminder: 'use strict' is enabled in runnable examples by default +// reminder: 'use strict' è abilitato di default negli esempio che stiamo eseguendo eval("let x = 5; function f() {}"); -alert(typeof x); // undefined (no such variable) -// function f is also not visible +alert(typeof x); // undefined (variabile inesistente) +// anche la funzione f non è visibile ``` -Without `use strict`, `eval` doesn't have its own lexical environment, so we would see `x` and `f` outside. +Senza `use strict`, `eval` non viene eseguito in un lexical environment separato, quindi saremo in grado di vedere `x` e `f` dall'esterno. -## Using "eval" +## Utilizzare "eval" -In modern programming `eval` is used very sparingly. It's often said that "eval is evil". +Nella programmazione moderna `eval` viene utilizzato di rado. Spesso si dice "eval is evil" ("eval è il diavolo"). -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 motivazione è piuttosto semplice: molto tempo fa, JavaScript era un linguaggio molto povero, molte cose potevano essere fatte solamente tramite `eval`. Ma quei tempi, ormai sono passati da un decennio. -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). +Al momento, non esiste alcuna ragione per cui utilizzare `eval`. Se qualcuno lo sta utilizzando, c'è una buona possibilità che questo sia rimpiazzabile con un costrutto del linguaggio oppure con un [modulo JavaScript](info:modules). -Please note that its ability to access outer variables has side-effects. +Fate attenzione che la sua capacità di accedere alle variabile esterne, può generare side-effects. -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. +I code minifiers (strumenti utilizzati sugli script JS prima di spostarli in produzione, per comprimerli) rinominano le variabili locali con nomi più brevi (come `a`, `b` etc) in modo da rendere il codice più breve. Questa operazione, solitamente, è sicura. Non lo è, però, se stiamo utilizzando `eval`, poiché al suo interno potremmo provare ad accedere alle variabili locali. Quindi i minifiers non rinominano tutte le variabili che sono potenzialmente accessibili da `eval`. Questo comporta una perdita di qualità della compressione del codice. -Using outer local variables inside `eval` is also considered a bad programming practice, as it makes maintaining the code more difficult. +L'utilizzo delle variabili locali all'interno di `eval` è considerata una bad practice nella programmazione, poiché rende il codice molto più complesso da mantenere. -There are two ways how to be totally safe from such problems. +Esistono due modi per mettersi al sicuro da questi problemi. -**If eval'ed code doesn't use outer variables, please call `eval` as `window.eval(...)`:** +**Se il codice all'interno di eval non richiede variabili esterne, allora invocate `eval` come `window.eval(...)`:** -This way the code is executed in the global scope: +In questo modo il codice viene eseguito nello scope globale: ```js untrusted refresh run let x = 1; { let x = 5; - window.eval('alert(x)'); // 1 (global variable) + window.eval('alert(x)'); // 1 (variabile globale) } ``` -**If eval'ed code needs local variables, change `eval` to `new Function` and pass them as arguments:** +**Se il codice all'interno di eval ha bisogno di variabili locali, sostituite `eval` con `new Function` e passategliele come argomenti:** ```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. +Il costrutto `new Function` viene spiegato più nel dettaglio nel capitolo . Crea una nuova funzione a partire da una stringa, sempre nello scope globale. Quindi può accedere alle variabili locali. Questo è molto più semplice passargliele esplicitamente come argomenti, come nell'esempio visto sopra. -## Summary +## Riepilogo -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. +L'invocazione di `eval(code)` esegue una stringa di codice e ne ritorna il risultato dell'ultima istruzione. +- Viene raramente utilizzano in JavaScript moderno, quindi in genere non ne avremo bisogno. +- Può accedere alle variabili locali. Questa è considerata una bad practice. +- Piuttosto di utilzzare `eval` nello scope globale, utilizzate `window.eval(code)`. +- Oppure, se il codice dovesse avere bisogno di data dallo scope esterno, utilizzate il costrutto `new Function` e passategliele come argomenti. From 1eacf66561e5a0a3f39f111a60e342354e73263f Mon Sep 17 00:00:00 2001 From: Andrea <45577511+longo-andrea@users.noreply.github.com> Date: Sun, 7 Mar 2021 13:21:24 +0100 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Simone Pasini <66781510+pasor1@users.noreply.github.com> --- .../02-eval/1-eval-calculator/solution.md | 2 +- .../02-eval/1-eval-calculator/task.md | 2 +- 1-js/99-js-misc/02-eval/article.md | 22 +++++++++---------- 3 files changed, 13 insertions(+), 13 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 9c200ebbe..9fe755c83 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) ); L'utente può inserire qualsiasi testo o codice. -Per rendere tutto più sicuro, limitiamo ai soli caratteri aritmetici, possiamo verificare `expr` utilizzando un'[espressione regolare](info:regular-expressions), in questo modo potrà contenere solamente cifre e operatori. +Per rendere il tutto più sicuro e consentire solo caratteri aritmetici, possiamo verificare `expr` utilizzando un'[espressione regolare](info:regular-expressions), in questo modo la stringa potrà contenere solamente cifre e operatori. 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 00b9aa689..a279ebeb9 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 @@ -4,7 +4,7 @@ importance: 4 # Eval-calculator -Create una calcolatrice che richiede all'utente (tramite prompt) un'espressione aritmetica e ne ritorni il risultato. +Create una calcolatrice che richieda all'utente (tramite prompt) un'espressione aritmetica e ne ritorni il risultato. Non c'è alcun bisogno di testare la correttezza dell'espressione. Limitatevi ad eseguirla e ritornarne il risultato. diff --git a/1-js/99-js-misc/02-eval/article.md b/1-js/99-js-misc/02-eval/article.md index 199940e2d..a5ebe104d 100644 --- a/1-js/99-js-misc/02-eval/article.md +++ b/1-js/99-js-misc/02-eval/article.md @@ -15,7 +15,7 @@ let code = 'alert("Hello")'; eval(code); // Hello ``` -Una stringa di codice potrebbe essere molto lunga, potrebbe contenere interruzioni di riga, dichiarazioni di funzione, variabili e cosi via. +Una stringa di codice può essere molto lunga, contenere interruzioni di riga, dichiarazioni di funzione, variabili e cosi via. Il risultato ritornato da `eval` corrisponde a quello dell'ultima istruzione. @@ -30,7 +30,7 @@ let value = eval('let i = 0; ++i'); alert(value); // 1 ``` -Il codice valutato viene eseguito nel lexical environment corrente, quindi può accedere alle variabili esterne: +Il codice valutato viene eseguito nel *lexical environment* corrente, quindi può accedere alle variabili esterne: ```js run no-beautify let a = 1; @@ -46,7 +46,7 @@ function f() { f(); ``` -Può quindi modificare le variabili esterne: +Allo stesso modo, può modificare le variabili esterne: ```js untrusted refresh run let x = 5; @@ -54,10 +54,10 @@ eval("x = 10"); alert(x); // 10, valore modificato ``` -In strict mode, `eval` viene eseguito in un lexical environment separato. Quindi le funzioni e le variabili dichiarate internamente, non sono visibili all'esterno: +In strict mode, `eval` viene eseguito in un *lexical environment* separato. Quindi le funzioni e le variabili dichiarate internamente, non sono visibili all'esterno: ```js untrusted refresh run -// reminder: 'use strict' è abilitato di default negli esempio che stiamo eseguendo +// attenzione: 'use strict' è abilitato di default negli esempi che stiamo eseguendo eval("let x = 5; function f() {}"); @@ -65,7 +65,7 @@ alert(typeof x); // undefined (variabile inesistente) // anche la funzione f non è visibile ``` -Senza `use strict`, `eval` non viene eseguito in un lexical environment separato, quindi saremo in grado di vedere `x` e `f` dall'esterno. +Senza `use strict`, `eval` non viene eseguito in un *lexical environment* separato, quindi saremo in grado di vedere `x` e `f` dall'esterno. ## Utilizzare "eval" @@ -75,9 +75,9 @@ La motivazione è piuttosto semplice: molto tempo fa, JavaScript era un linguagg Al momento, non esiste alcuna ragione per cui utilizzare `eval`. Se qualcuno lo sta utilizzando, c'è una buona possibilità che questo sia rimpiazzabile con un costrutto del linguaggio oppure con un [modulo JavaScript](info:modules). -Fate attenzione che la sua capacità di accedere alle variabile esterne, può generare side-effects. +Fate attenzione: la sua capacità di accedere alle variabile esterne può generare side-effects. -I code minifiers (strumenti utilizzati sugli script JS prima di spostarli in produzione, per comprimerli) rinominano le variabili locali con nomi più brevi (come `a`, `b` etc) in modo da rendere il codice più breve. Questa operazione, solitamente, è sicura. Non lo è, però, se stiamo utilizzando `eval`, poiché al suo interno potremmo provare ad accedere alle variabili locali. Quindi i minifiers non rinominano tutte le variabili che sono potenzialmente accessibili da `eval`. Questo comporta una perdita di qualità della compressione del codice. +I *code minifiers* (strumenti utilizzati per comprimere gli script JS prima di metterli in produzione) rinominano le variabili locali con nomi più brevi (come `a`, `b` etc) in modo da rendere il codice più breve. Questa operazione, solitamente, è sicura. Non lo è, però, se stiamo utilizzando `eval`, poiché al suo interno potremmo provare ad accedere alle variabili locali. Quindi i minifiers non rinominano tutte le variabili che sono potenzialmente accessibili da `eval`. Questo comporta un peggioramento del fattore di compressione del codice. L'utilizzo delle variabili locali all'interno di `eval` è considerata una bad practice nella programmazione, poiché rende il codice molto più complesso da mantenere. @@ -103,12 +103,12 @@ let f = new Function('a', 'alert(a)'); f(5); // 5 ``` -Il costrutto `new Function` viene spiegato più nel dettaglio nel capitolo . Crea una nuova funzione a partire da una stringa, sempre nello scope globale. Quindi può accedere alle variabili locali. Questo è molto più semplice passargliele esplicitamente come argomenti, come nell'esempio visto sopra. +Il costrutto `new Function`, che viene spiegato più nel dettaglio nel capitolo , crea una nuova funzione a partire da una stringa. Questa viene creata nel contesto globale, quindi non può accedere alle variabili locali, ma è comunque possibile passargliele esplicitamente come argomenti, come nell'esempio visto sopra. ## Riepilogo L'invocazione di `eval(code)` esegue una stringa di codice e ne ritorna il risultato dell'ultima istruzione. -- Viene raramente utilizzano in JavaScript moderno, quindi in genere non ne avremo bisogno. +- Viene raramente utilizzato in JavaScript moderno, quindi in genere non ne avremo bisogno. - Può accedere alle variabili locali. Questa è considerata una bad practice. - Piuttosto di utilzzare `eval` nello scope globale, utilizzate `window.eval(code)`. -- Oppure, se il codice dovesse avere bisogno di data dallo scope esterno, utilizzate il costrutto `new Function` e passategliele come argomenti. +- Oppure, se il codice dovesse avere bisogno di dati dallo scope esterno, utilizzate il costrutto `new Function` e passateglieli come argomenti. From 0a1678c48e0b125e78a9c2024d9787dde7d4accb Mon Sep 17 00:00:00 2001 From: Andrea <45577511+longo-andrea@users.noreply.github.com> Date: Sun, 7 Mar 2021 20:55:52 +0100 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Dorin David <70648503+Dorin-David@users.noreply.github.com> --- 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 a5ebe104d..acbfd091f 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 @@ Nella programmazione moderna `eval` viene utilizzato di rado. Spesso si dice "ev La motivazione è piuttosto semplice: molto tempo fa, JavaScript era un linguaggio molto povero, molte cose potevano essere fatte solamente tramite `eval`. Ma quei tempi, ormai sono passati da un decennio. -Al momento, non esiste alcuna ragione per cui utilizzare `eval`. Se qualcuno lo sta utilizzando, c'è una buona possibilità che questo sia rimpiazzabile con un costrutto del linguaggio oppure con un [modulo JavaScript](info:modules). +Al momento, non esiste alcuna ragione per utilizzare `eval`. Se qualcuno lo sta utilizzando, c'è una buona possibilità che questo sia rimpiazzabile con un costrutto del linguaggio oppure con un [modulo JavaScript](info:modules). Fate attenzione: la sua capacità di accedere alle variabile esterne può generare side-effects.