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: chapters/10-modulos.md
+16-15Lines changed: 16 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,4 @@
1
+
1
2
Capítulo 10
2
3
3
4
# Módulos
@@ -64,7 +65,7 @@ Funções são o único construtor em JavaScript que criam um novo escopo. Entã
64
65
65
66
Considere este módulo trivial que associa nomes com o número dos dias da semana retornado pelo método `getDay` de um objeto *date*.
66
67
67
-
```
68
+
```javascript
68
69
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
69
70
"Thursday", "Friday", "Saturday"];
70
71
functiondayName(number) {
@@ -79,7 +80,7 @@ A função `dayName` é parte desta interface, mas a variável `names` não. Nó
79
80
80
81
Podemos fazer isso:
81
82
82
-
```
83
+
```javascript
83
84
vardayName=function() {
84
85
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
85
86
"Thursday", "Friday", "Saturday"];
@@ -96,7 +97,7 @@ Agora `names` é uma variável local dentro de uma função (anônima). Esta fun
96
97
97
98
Um padrão similar é usado para isolar inteiramente código do mundo exterior. O módulo abaixo tem algum efeito, mas não fornece qualquer valor para outros módulos usarem.
98
99
99
-
```
100
+
```javascript
100
101
(function() {
101
102
functionsquare(x) { return x * x; }
102
103
var hundred =100;
@@ -114,7 +115,7 @@ Por que a função namespace está encapsulada em uma par de parênteses? Isso t
114
115
115
116
Agora imagine que o módulo dia-da-semana (*day-of-the-week*) precise fornecer não uma, mas duas funções, porque nós adicionamos uma função `dayNumber` que vai de um nome para um número. Nós podemos mais simplesmente retornar a função, mas devemos encapsular as duas funções em um objeto.
116
117
117
-
```
118
+
```javascript
118
119
varweekDay=function() {
119
120
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
Para módulos maiores, juntar todos os módulos exportados em um objeto no fim da função se torna algo incômodo, e geralmente requer que façamos algo repetido. Isso pode ser melhorado declarando um objeto, usualmente nomeado `exports`, e adicionando propriedades a este objeto sempre que nós definirmos algo que precise ser exportado. Este objeto pode então ser retornado, ou aceito como um parâmetro armazenado em algum lugar pelo código exterior ao módulo.
132
133
133
-
```
134
+
```javascript
134
135
(function(exports) {
135
136
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
136
137
"Thursday", "Friday", "Saturday"];
@@ -167,7 +168,7 @@ Existem várias formas de se pegar dados (uma `string` de código) e rodá-los n
167
168
168
169
A mais óbvia maneira é o operador padrão especial `eval`, que vai executar a string de código no escopo atual. Isso usualmente é uma ideia muito ruim, porque quebra algumas propriedades que escopos normalmente tem (ser isolado do mundo externo é a mais notável).
169
170
170
-
```
171
+
```javascript
171
172
functionevalAndReturnX(code) {
172
173
eval(code);
173
174
return x;
@@ -179,7 +180,7 @@ console.log(evalAndReturnX("var x = 2"));
179
180
180
181
A melhor forma de converter dados dentro do programa é usar uma função construtora. Ela recebe como argumentos uma lista de nomes de argumentos separados por vírgula, e então uma string contendo o corpo da função.
181
182
182
-
```
183
+
```javascript
183
184
var plusOne =newFunction("n", "return n + 1;");
184
185
console.log(plusOne(4));
185
186
// → 5
@@ -191,7 +192,7 @@ Isso é precisamente o que precisamos - podemos encapsular o código para um mó
191
192
192
193
Se a nova função construtora, usada pelo nosso módulo de carregamento, encapsula o código em uma função de qualquer forma, nós podemos omitir a função *namespace* encapsuladora atual dos arquivos. Nós também vamos fazer `exports` um argumento à função módulo, então o módulo não precisará de declarar isso. Isso remove um monte de barulho supérfluo do nosso módulo de exemplo:
193
194
194
-
```
195
+
```javascript
195
196
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
Quando usando este sistema, um módulo tipicamente começa com pequenas declarações de variáveis que carregam os módulos que ele precisa.
221
222
222
-
```
223
+
```javascript
223
224
var weekDay =require("weekDay");
224
225
var today =require("today");
225
226
@@ -234,7 +235,7 @@ O segundo problema é que não é possível para um módulo expor diretamente um
234
235
235
236
A solução tradicional para isso é fornecer outra variável, `module`, que é um objeto que tem a propriedade `exports`. Essa propriedade inicialmente aponta para o objeto vazio criado por require, mas pode ser sobrescrita com outro valor para exportar algo a mais.
236
237
237
-
```
238
+
```javascript
238
239
functionrequire(name) {
239
240
if (name inrequire.cache)
240
241
returnrequire.cache[name];
@@ -263,7 +264,7 @@ Outra solução é encapsular seu módulo em uma função, carregar os módulos
263
264
264
265
Nosso programa trivial com dependências, em AMD, se parece com isso:
@@ -273,7 +274,7 @@ A função `define` é o conceito central nessa abordagem. Ela primeiro recebe u
273
274
274
275
Os módulos que são carregados dessa forma devem conter uma chamada a `define`. O valor usado para sua interface é qualquer valor retornado pela função que é o segundo argumento passado nessa chamada. Aqui está o módulo `weekDay` de novo.
275
276
276
-
```
277
+
```javascript
277
278
define([], function() {
278
279
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
279
280
"Thursday", "Friday", "Saturday"];
@@ -286,7 +287,7 @@ define([], function() {
286
287
287
288
Para mostrar uma simples implementação de `define`, vamos supor que também temos uma função `backgroundReadFile`, que pega o nome do arquivo e uma função, e vai chamar a função com o conteúdo do arquivo assim que este for carregado.
288
289
289
-
```
290
+
```javascript
290
291
functiondefine(depNames, moduleFunction) {
291
292
var deps = [], myMod =define.currentModule;
292
293
@@ -377,7 +378,7 @@ Existem duas abordagens populares para tais módulos. Uma é chamada "Módulos C
377
378
378
379
Escreva um simples módulo similar ao módulo `weekDay`, que pode converter os números dos meses (*zero-based*, assim como o tipo `Date`) para nomes, e nomes para números. Dê a este módulo seu próprio namespace, pois ele vai precisar de um array interno com o nome dos meses, mas use JavaScript puro, sem nenhum sistema de carregamento de módulos.
0 commit comments