-
-
Notifications
You must be signed in to change notification settings - Fork 865
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Avançando tradução do Cap 2 de "Escopos e Clausuras" #96
Changes from 1 commit
00eeb78
f127d3e
aa21fd0
cba82d7
3434e50
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -72,27 +72,27 @@ Não importa o *local* onde uma função é invocada, ou até mesmo *como* é in | |
|
||
O processo de consulta ao escopo léxico ocorre *apenas" em identificadores de primeira classe, como `a`, `b` e `c`. Se você tivesse uma referência para `foo.bar.baz` em um trecho de código, ocorreria uma consulta ao escopo léxico para localizar o identificador `foo`, mas no momento que esta variável é localizada, regras de acesso à propriedades de objetos assumem o comando para resolução das propriedades `bar` e `baz`, respectivamente. | ||
|
||
## Cheating Lexical | ||
## Trapaceando o Léxico | ||
|
||
If lexical scope is defined only by where a function is declared, which is entirely an author-time decision, how could there possibly be a way to "modify" (aka, cheat) lexical scope at run-time? | ||
Se o escopo léxico é de fato definido apenas pelo local onde uma função é declarada, cuja decisão vem do autor do código durante a programação, como pode haver uma maneira de "modificar" (ou trapacear) o escopo léxico em tempo de execução? | ||
|
||
JavaScript has two such mechanisms. Both of them are equally frowned-upon in the wider community as bad practices to use in your code. But the typical arguments against them are often missing the most important point: **cheating lexical scope leads to poorer performance.** | ||
JavaScript possui dois mecanismos para isso. Ambos são vistos como má prática e igualmente (e amplamente!) desencorajados pela comunidade de modo geral, embora os argumentos que sustentam esta opinião normalmente não trazem consigo o ponto mais relevante: **trapacear o escopo léxico leva a um pior desempenho.** | ||
|
||
Before I explain the performance issue, though, let's look at how these two mechanisms work. | ||
Antes de explicar a questão da performance, porém, vamos olhar a forma com que estes dois mecanismos funcionam. | ||
|
||
### `eval` | ||
|
||
The `eval(..)` function in JavaScript takes a string as an argument, and treats the contents of the string as if it had actually been authored code at that point in the program. In other words, you can programmatically generate code inside of your authored code, and run the generated code as if it had been there at author time. | ||
A função `eval(..)` em JavaScript recebe uma string como argumento e trata o conteúdo desta string como se tivesse de fato sido programado pelo autor do código naquele ponto do programa. Em outras palavras, você pode gerar código dinamicamente dentro do seu programa e executar este código como se estivesse lá desde o momento da programação. | ||
|
||
Evaluating `eval(..)` (pun intended) in that light, it should be clear how `eval(..)` allows you to modify the lexical scope environment by cheating and pretending that author-time (aka, lexical) code was there all along. | ||
Colocando desta forma, deve estar claro a forma com que `eval(..)` permite a você modificar o ambiente do escopo léxico ao trapacear e portanto fingir que aquele código estava lá desde o princípio. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avaliando Novamente, não consegui pensar numa forma melhor de referenciar author-time. Me pareceu um modelo adotado pelo próprio autor (carece de outras fontes). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Na minha opinião, o significado do trocadilho é perdido ao sairmos da língua inglesa. Dentro deste contexto, a tradução com menos perda de sentido para Talvez o equivalente em língua portuguesa fosse um joguete como "Evaliando", mas isto seria um completo desserviço ao leitor, que, ao meu ver, também pode ter dificuldade de entender sua sugestão se não tiver algum conhecimento prévio da língua inglesa. Meus dois centavos ;) 👍 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @gmsecrieru ia escrever a mensagem mas fiquei sem internet 🎃 Concorco com suas observações, vamos manter assim conforme você falou. Enviei uma mensagem pro autor solicitando uma luz sobre um sinônimo apropriado (sugeri lexical-time). Seus pontos são sempre muito válidos, adoraria conversar mais sobre o projeto (e assuntos relacionados) com você. Pode me passar algum contato seu? À parte disso, posso te colocar no projeto (write access) para me ajudar nas revisões das traduções e opinar sobre os rumos do trablho, tem algum interesse? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ótima ideia! Com alguma sorte ele pode nos auxiliar na melhor maneira de traduzir! Muito obrigado pelo convite, vai ser um prazer ajudar nas revisões e me envolver mais com o projeto. Meu e-mail é george [at] secrieru ponto net |
||
|
||
On subsequent lines of code after an `eval(..)` has executed, the *Engine* will not "know" or "care" that the previous code in question was dynamically interpreted and thus modified the lexical scope environment. The *Engine* will simply perform its lexical scope look-ups as it always does. | ||
Durante a execução das linhas que sucedem a chamada para `eval(..)`, o *Motor* não vai "saber" ou "se importar" se o código em questão foi interpretado dinamicamente e portanto modificou o ambiente do escopo léxico. O *Motor* vai seguir efetuando suas consultas ao escopo léxico da mesma forma de sempre. | ||
|
||
Consider the following code: | ||
Considere o código a seguir: | ||
|
||
```js | ||
function foo(str, a) { | ||
eval( str ); // cheating! | ||
eval( str ); // trapaça! | ||
console.log( a, b ); | ||
} | ||
|
||
|
@@ -101,9 +101,9 @@ var b = 2; | |
foo( "var b = 3;", 1 ); // 1, 3 | ||
``` | ||
|
||
The string `"var b = 3;"` is treated, at the point of the `eval(..)` call, as code that was there all along. Because that code happens to declare a new variable `b`, it modifies the existing lexical scope of `foo(..)`. In fact, as mentioned above, this code actually creates variable `b` inside of `foo(..)` that shadows the `b` that was declared in the outer (global) scope. | ||
A string `"var b = 3;"` é tratada, naquele ponto onde `eval(..)` é chamado, como um código que esteve lá desde o princípio. Pelo fato deste código declarar uma nova variável `b`, ele modifica o atual escopo léxico de `foo(..)`. O que ocorre, como mencionado acima, é que este código literalmente cria a variável `b` dentro de `foo(..)`, o que acaba por sombrear a variável `b` que foi declarada no escopo externo (neste caso, o global). | ||
|
||
When the `console.log(..)` call occurs, it finds both `a` and `b` in the scope of `foo(..)`, and never finds the outer `b`. Thus, we print out "1, 3" instead of "1, 2" as would have normally been the case. | ||
Quando a chamada para `console.log(..)` ocorre, são encontradas tanto `a` quanto `b` no escopo de `foo(..)`, e portanto nunca a variável `b` externa. Sendo assim, imprimimos "1, 3" em vez de "1, 2" como normalmente ocorreria. | ||
|
||
**Note:** In this example, for simplicity's sake, the string of "code" we pass in was a fixed literal. But it could easily have been programmatically created by adding characters together based on your program's logic. `eval(..)` is usually used to execute dynamically created code, as dynamically evaluating essentially static code from a string literal would provide no real benefit to just authoring the code directly. | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cuja decisão vem do autor do código durante a programaçãoque é uma decisão inteiramente author-timeAuthor-time
se refere ao momento de escrita (autoria) do escopo (léxico), não o tempo que ele é executado (runtime). Foi essa associação que ele quis dizer.O exemplo que consigo pensar agora é this, que tem sua associação (binding) executada no runtime, não em author-time. Ou seja, onde você escreve ele não importa, no momento da execução do código (runtime), o JS define onde o
this
está.Coloquei o exemplo porque também ainda não pensei num termo apropriado para author-time, se tiver alguma sugestão será ótimo. Se de tudo não conseguirmos chegar num modelo ideal, acho válido manter author-time. Ele explica mais sobre author-time/runtime no próximo livro, mas não li com cuidado a ponto de opinar.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Diferente de
runtime
oucompile time
, que são termos com valor semântico dentro das Ciências da Computação,author-time
me parece se tratar de uma terminologia cunhada pelo autor aproveitando-se de um recurso que a língua inglesa proporciona, que é a facilidade de se criar supostos "neologismos" que passam a ter o valor semântico justamente por sua semelhança com outros jargões da mesma área -- neste caso,runtime
(cuja tradução comum é de fatotempo de execução
) . A minha escolha para esta flexibilização se deu também pelo fato de, curiosamente, encontrar esta dúvida enquanto procurava a melhor forma de fazê-lo :)