1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
|
---
title: Strict mode
slug: Web/JavaScript/Reference/Strict_mode
translation_of: Web/JavaScript/Reference/Strict_mode
---
<div>{{JsSidebar("More")}}</div>
<p>O <strong>strict mode</strong> do <a class="external" href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">ECMAScript 5</a> é uma forma de <em>optar</em> por uma variante restrita do JavaScript. O strict mode não é apenas um subconjunto: ele <em>intencionalmente</em> tem semânticas diferentes do código normal. Navegadores que não suportam strict mode executarão código strict mode com um comportamento diferente dos navegadores que suportam, então não confie no strict mode sem testar o suporte a funcionalidades dos aspectos relevantes do strict mode. Código strict mode e código não-strict mode podem coexistir, então scripts podem optar pelo strict mode incrementalmente.</p>
<p>O strict mode faz várias mudanças nas semânticas normais do JavaScript. Primeiro, o strict mode elimina alguns erros silenciosos do JavaScript fazendo-os lançar exceções. Segundo, o strict mode evita equívocos que dificultam que motores JavaScript realizem otimizações: código strict mode pode às vezes ser feito para executar mais rápido que código idêntico não-strict mode. Terceiro, strict mode proíbe algumas sintaxes que provavelmente serão definidas em versões futuras do ECMAScript.</p>
<p>Veja <a href="/en-US/docs/Web/JavaScript/Reference/Strict_mode/Transitioning_to_strict_mode">transitioning to strict mode</a> se você quer mudar seu código para funcionar na variante restrita do JavaScript.</p>
<h2 id="Invocando_strict_mode">Invocando strict mode</h2>
<p>Strict mode se aplica a <em>scripts </em>inteiros ou <em>funções individuais</em>. Ele não se aplica a declarações de bloco fechadas em chaves <code>{}</code>; tentar aplicá-lo a tais contextos não faz nada. Código <code>eval</code>, código <code>Function</code>, atributos <em>event handlers</em>, strings passadas para <code><a href="/pt-BR/docs/Web/API/WindowTimers.setTimeout" title="en-US/DOM/window.setTimeout">setTimeout</a></code> e coisas do tipo são scripts inteiros, e invocar strict mode neles funciona como esperado.</p>
<h3 id="Strict_mode_para_scripts">Strict mode para scripts</h3>
<p>Para invocar strict mode para um script inteiro, coloque <em>exatamente</em> a declaração <code>"use strict";</code> (ou <code>'use strict';</code>) antes de qualquer outra declaração.</p>
<pre class="brush: js">// Sintaxe strict mode para todo o script
"use strict";
var v = "Oi! Eu sou um script strict mode!";
</pre>
<p>Essa sintaxe tem uma armadilha que <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=579119">já pegou</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=627531">um site grande</a>: não é possível concatenar cegamente scripts não-conflitantes. Considere concatenar um script strict mode com um script não-strict mode: a concatenação inteira parece strict! O inverso também é verdade: não-strict mais strict parece não-strict. Concatenar scripts strict mode com outros é bom, e concatenar scripts não-strict mode é bom. Simplesmente concatenar scripts strict e não-strict é problemático. Portanto é recomendado que você ative strict mode função-por-função (pelo menos durante o período de transição).</p>
<p>Você também pode usar a abordagem de embrulhar o conteúdo inteiro de um script em uma função e fazer a função externa usar strict mode. Isto elimina o problema da concatenação, mas significa que você tem que exportar explicitamente quaisquer variáveis globais fora do escopo da função.</p>
<h3 id="Strict_mode_para_funções">Strict mode para funções</h3>
<p>Da mesma forma, para invocar strict mode para uma função, coloque <em>exatamente</em> a declaração <code>"use strict";</code> (ou <code>'use strict';</code>) no corpo da função antes de qualquer outra declaração.</p>
<pre class="brush: js">function strict(){
// Sintaxe strict mode a nível de função
'use strict';
function nested() { return "E eu também!"; }
return "Oi! Eu sou uma função strict mode! " + nested();
}
function notStrict() { return "Eu não sou strict."; }
</pre>
<h2 id="Mudanças_no_strict_mode">Mudanças no strict mode</h2>
<p>Strict mode muda tanto a sintaxe quando o comportamento em tempo de execução. Mudanças geralmente se encaixam em uma destas categorias: mudanças que convertem equívocos em erros (como erros de sintaxe ou em tempo de execução), mudanças que simplificam como uma variável particular para um dado uso de um nome é computada, mudanças que simplificam <code>eval</code> e <code>arguments</code>, mudanças que facilitam JavaScript "seguro", e mudanças que antecipam a evolução futura do ECMAScript.</p>
<h3 id="Convertendo_equívocos_em_erros">Convertendo equívocos em erros</h3>
<p>Strict mode transforma em erros alguns equívocos anteriormente aceitos. O JavaScript foi projetado para ser fácil para novos desenvolvedores, e algumas vezes ele dá semânticas de não-erros a operações que deveriam ser erros. Algumas vezes isso resolve o problema pontual, mas outras vezes cria problemas piores no futuro. Strict mode trata esses equívocos como erros para que sejam descobertos e consertados prontamente.</p>
<p>Primeiro, o strict mode impossibilita criar variáveis globais acidentalmente. Em JavaScript normal, cometer um erro de digitação ao digitar uma variável em uma atribuição cria uma nova propriedade no objeto global e continua a "funcionar" (embora falhas futuras sejam possíveis: provavelmente, em JavaScript moderno). Atribuições que acidentalmente criariam variáveis globais lançam exceções em vez disso no strict mode:</p>
<pre class="brush: js">"use strict";
// Assumindo que uma variável global variavelErrada existe
variavellErrada = 17; // esta linha lança ReferenceError por conta do
// erro de digitação da variável
</pre>
<p>Segundo, strict mode faz com que atribuições que outrora falhariam silenciosamente lançar uma exceção. Por exemplo, <code>NaN</code> é uma variável global não-atribuível. Em código normal, atribuir a <code>NaN</code> não faz nada; o desenvolvedor não recebe qualquer resposta de falha. No strict mode, atribuir a <code>NaN</code> lança uma exceção. Qualquer atribuição que falha silenciosamente em código normal (atribuir a uma propriedade não-atribuível, atribuir a uma propriedade getter-only, atribuir a uma propriedade de um objeto <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions">não-extensível</a>) lançarão exceções em strict mode:</p>
<pre class="brush: js">"use strict";
// Atribuir a uma propriedade não-atribuível
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // lança TypeError
// Atribuir a uma propriedade getter-only
var obj2 = { get x() { return 17; } };
obj2.x = 5; // lança TypeError
// Atribuir a uma nova propriedade de um objeto não-extensível
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // lança TypeError
</pre>
<p>Terceiro, strict mode faz com que tentativas de deletar propriedades não-deletáveis lancem exceções (onde anteriormente a tentativa simplesmente não faria efeito):</p>
<pre class="brush: js">"use strict";
delete Object.prototype; // lança TypeError
</pre>
<p>Quarto, strict mode anterior ao Gecko 34 requer que todas as propriedades nomeadas em um objeto literal sejam únicas. Código normal pode duplicar nomes de propriedades, sendo que a última ocorrência determina o valor da propriedade. Mas como apenas o último faz algo, a duplicação é meramente um vetor de bugs, se o código for modificado para mudar o valor da propriedade por outro meio que não modificando a última instância. Nomes de propriedades duplicados são erro de sintaxe em strict mode:</p>
<div class="note">
<p>Não é mais o caso no ECMAScript 6 ({{bug(1041128)}}).</p>
</div>
<pre class="brush: js">"use strict";
var o = { p: 1, p: 2 }; // !!! erro de sintaxe
</pre>
<p>Quinto, strict mode exige que nomes de parâmetros de função sejam únicos. Em código normal, o último argumento duplicado esconde argumentos anteriores com nome semelhante. Estes argumentos anteriores continuam disponíveis através de <code>arguments[i]</code><strong>,</strong> portanto não são completamente inacessíveis. Entretanto, esta ocultação faz pouco sentido e provavelmente é indesejável (pode esconder um erro de digitação, por exemplo), então em strict mode nomes de argumentos duplicados são erro de sintaxe:</p>
<pre class="brush: js">function sum(a, a, c){ // !!! erro de sintaxe
"use strict";
return a + b + c; // errado se este código executasse
}
</pre>
<p>Sexto, strict mode em ECMAScript 5 proíbe sintaxe octal. Sintaxe ocatal não é parte do ECMAScript 5, mas é suportado em todos os navegadores prefixando o número octal com um zero: <code>0644 === 420</code> e <code>"\045" === "%"</code>. No ECMAScript 6, número octal é suportado prefixando um número com "<code>0o</code>": </p>
<pre class="brush: js">var a = 0o10; // ES6: Octal</pre>
<p>Novos desenvolvedores algumas vezes acham que um prefixo zero não tem significado semântico, então eles o utilizam como mecanismo de alinhamento — mas isso muda o significado do número! Sintaxe octal é raramente útil e pode ser usada equivocadamente, então o strict mode torna octal erro de sintaxe:</p>
<pre class="brush: js">"use strict";
var sum = 015 + // !!! erro de sintaxe
197 +
142;
</pre>
<p>Sétimo, strict mode em ECMAScript 6 proíbe definir propriedades em valores {{Glossary("Primitivo", "primitivos")}}. Sem strict mode, definir uma propriedade é simplesmente ignorado; com strict mode, no entanto, um {{jsxref("TypeError")}} é lançado.</p>
<pre class="brush: js">(function() {
"use strict";
false.true = ""; // TypeError
(14).navegandoPara = "casa"; // TypeError
"com".voce = "distante"; // TypeError
})();</pre>
<h3 id="Simplificando_usos_de_variáveis">Simplificando usos de variáveis</h3>
<p>Strict mode simplifica como nomes de variáveis se mapeiam a definições de variáveis particulares no código. Muitas otimizações de compiladores dependem da habilidade de dizer que variável <em>X</em> está guardada <em>naquele</em> local; isto é crítico para otimizar completamente o código JavaScript. JavaScript às vezes torna este mapeamento básico de nome para definição de variável no código impossível de executar até o tempo de execução. Strict mode remove a maioria dos casos onde isso acontece, então o compilador pode otimizar melhor código strict mode.</p>
<p>Primeiro, strict mode proíbe <code>with</code>. O problema com <code>with</code> é que qualquer nome dentro do block pode mapear tanto para uma propriedade do objeto passado quanto para uma variável no escopo envolvente (ou até global), em tempo de execução: é impossível saber qual de antemão. Strict mode torna <code>with</code> um erro de sintaxe, então não há chance de um nome em um <code>with</code> referir-re a uma localização deconhecida em tempo de execução:</p>
<pre class="brush: js">"use strict";
var x = 17;
with (obj) // !!! erro de sintaxe
{
// Se isto não fosse strict mode, isso seria var x ou obj.x?
// No geral, é impossível saber sem executar o código, então
// o nome não pode ser otimizado.
x;
}
</pre>
<p>A alternativa simples de atribuir o objeto a uma variável de nome curto, e então acessar a propriedade correspondente naquela variável, está pronta para substituir <code>with</code>.</p>
<p>Segundo, <a href="http://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval-code-are-local-to-that-code-only/">eval de código strict mode não introduz novas variáves no escopo envolvente</a>. Em código normal, <code>eval("var x;")</code> introduz uma variável <code>x</code> na função envolvente ou no escopo global. Isto significa que, no geral, em uma função que contém uma chamada para <code>eval</code>, todo nome que não se refere a um argumento ou variável local deve ser mapeado para uma definição particular em tempo de execução (porque aquele <code>eval</code> pode ter introduzido uma nova variável que esconderia a variável externa). No strict mode, <code>eval</code> cria variáveis apenas para o código sendo avaliado, portanto <code>eval</code> não pode afetar se um nome se refere a uma variável externa ou alguma variável local:</p>
<pre class="brush: js">var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
console.assert(x === 17);
console.assert(evalX === 42);
</pre>
<p>Relacionadamente, se a função <code>eval</code> for invocada por uma expressão da forma <code>eval(...)</code> em código strict mode, o código será avaliado como código strict mode. O código pode invocar strict code explicitamente, mas não é necessário.</p>
<pre class="brush: js">function strict1(str){
"use strict";
return eval(str); // str será tratado como código strict mode
}
function strict2(f, str){
"use strict";
return f(str); // não é eval(...): str é strict se e
// somente se invocar strict mode
}
function nonstrict(str){
return eval(str); // str é strict se e somente se
// invocar strict mode
}
strict1("'Código strict mode!'");
strict1("'use strict'; 'Código strict mode!'");
strict2(eval, "'Código não-strict.'");
strict2(eval, "'use strict'; 'Código strict mode!'");
nonstrict("'Código não-strict.'");
nonstrict("'use strict'; 'Código strict mode!'");
</pre>
<p>Portanto nomes em código <code>eval</code> de strict mode se comportam da mesma forma que nomes em código strict mode que não estão sendo avaliados como resultado de <code>eval</code>.</p>
<p>Terceiro, strict mode proíbe deletar nomes simples. <code>delete name</code> em strict mode é erro de sintaxe:</p>
<pre class="brush: js">"use strict";
var x;
delete x; // !!! erro de sintaxe
eval("var y; delete y;"); // !!! erro de sintaxe</pre>
<h3 id="Tornando_eval_e_arguments_mais_simples">Tornando <code>eval</code> e <code>arguments</code> mais simples</h3>
<p>Strict mode torna <code>arguments</code> e <code>eval</code> menos estranhamente mágicos. Ambos envolvem uma quantidade considerável de comportamento mágico em código normal: <code>eval</code> para adicionar ou remover <em>bindings</em> e para mudar valores de <em>bindings</em>, e <code>arguments</code> com suas propriedades indexadas como <em>alias</em> de argumentos nomeados. Strict mode dá grandes passos na direção de tratar <code>eval</code> e <code>arguments</code> como palavras-chave, embora reparos completos não venham até uma futura edição do ECMAScript.</p>
<p>Primeiro, os nomes <code>eval</code> e <code>arguments</code> não podem ser vinculados ou atribuídos na sintaxe da linguagem. Todas as tentativas são erros de sintaxe:</p>
<pre class="brush: js">"use strict";
eval = 17;
arguments++;
++eval;
var obj = { set p(arguments) { } };
var eval;
try { } catch (arguments) { }
function x(eval) { }
function arguments() { }
var y = function eval() { };
var f = new Function("arguments", "'use strict'; return 17;");
</pre>
<p>Segundo, código strict mode não faz <em>alias</em> para propriedades de objetos <code>arguments</code> criados dentro de si. Em código normal dentro de uma função cujo primeiro argumento é <code>arg</code>, definir <code>arg</code> também define <code>arguments[0]</code>, e vice-versa (a menos que nenhum argumento seja fornecido ou <code>arguments[0]</code> seja deletado). Objetos <code>arguments</code> para funções strict mode armazenam os argumentos originais quando a função é invocada. <code>arguments[i]</code> não rastreia o valor do argumento nomeado correspondente, nem um argumento nomeado rastreia o valor do <code>arguments[i]</code> correspondente.</p>
<pre class="brush: js">function f(a){
"use strict";
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);
</pre>
<p>Terceiro, <code>arguments.callee</code> não é mais suportado. Em código normal, <code>arguments.callee</code> se refere à função envolvente. Esse caso de uso é frágil: apenas nomeie a função envolvente! Além disso, <code>arguments.callee</code> prejudica substancialmente otimizações como tornar funções <em>inline</em> porque deve ser possível fornecer uma referência à função não-<em>inline</em> se <code>arguments.callee</code> for acessado. <code>arguments.callee</code> para funções strict mode é uma propriedade não-deletável que lança exceção quando atribuída ou recuperada:</p>
<pre class="brush: js">"use strict";
var f = function() { return arguments.callee; };
f(); // lança TypeError
</pre>
<h3 id="Tornando_JavaScript_seguro">Tornando JavaScript "seguro"</h3>
<p>Strict mode torna mais fácil escrever JavaScript "seguro". Alguns websites agora oferecem formas de escrever JavaScript que será executado pelo website <em>em nome de outros usuários</em>. JavaScript nos navegadores pode acessar informações privadas do usuário, então tal JavaScript deve ser parcialmente transformado antes de executado, para barrar acesso a funcionalidades proibidas. A flexibilidade do JavaScript torna isso efetivamente impossível sem várias verificações em tempo de execução. Algumas funções da linguagem são tão pervasivas que fazer verificações em tempo de execução tem um custo de desempenho considerável. Alguns ajustes do strict mode, mais a exigência de que o JavaScript submetido por usuários seja código strict mode e invocá-lo de uma certa maneira, reduz substancialmente a necessidade de realizar verificações em tempo de execução.</p>
<p>Primeiro, o valor passado como <code>this</code> para uma função em strict mode não é forçado a ser um objeto (entenda-se "encaixotamento"). Para uma função normal, <code>this</code> é sempre um objeto: seja o objeto fornecido se chamado com um <code>this</code> cujo valor é um objeto; o valor, encaixotado, se chamado com um <code>this</code> Boolean, string ou número; ou o objeto global se chamado com um <code>this</code> <code>undefined</code> ou <code>null</code>. Use <a href="/en-US/Web/JavaScript/Reference/Global_Objects/Function/call" title="en-US/JavaScript/Reference/Global_Objects/Function/call"><code>call</code></a>, <a href="/en-US/Web/JavaScript/Reference/Global_Objects/Function/apply" title="en-US/JavaScript/Reference/Global_Objects/Function/apply"><code>apply</code></a>, ou <code><a href="/en-US/Web/JavaScript/Reference/Global_Objects/Function/bind" title="en-US/JavaScript/Reference/Global_Objects/Function/bind">bind</a></code> para especificar um determinado <code>this</code>. O encaixotamento automático não apenas é um custo de desempenho, como também expor o objeto global em navegadores é um risco de segurança, porque o objeto global oferece acesso a funcionalidades que ambientes JavaScript "seguros" devem restringir. Assim, para uma função strict mode, o <code>this</code> especificado não é encaixotado em um objeto, e se não especificado, <code>this</code> será <code>undefined</code>:</p>
<pre class="brush: js">"use strict";
function fun() { return this; }
console.assert(fun() === undefined);
console.assert(fun.call(2) === 2);
console.assert(fun.apply(null) === null);
console.assert(fun.call(undefined) === undefined);
console.assert(fun.bind(true)() === true);
</pre>
<p>Isso significa, além de outras coisas, que em navegadores não é mais possíveis referenciar o objeto <code>window</code> através de <code>this</code> dentro de uma função strict mode.</p>
<p>Segundo, em strict mode não é mais possível "caminhar" a pilha JavaScript via extensões do ECMAScript comumente implementadas. Em código normal com essas extensões, quando uma funçao <code>fun</code> está no meio de ser chamada, <code>fun.caller</code> é a função que chamou <code>fun</code> mais recentemente, e <code>fun.arguments</code> é o <code>arguments</code> para aquela invocação de <code>fun</code>. Ambas as extensões são problemáticas para JavaScript "seguro" porque permitem que código "seguro" acesse funções "privilegiadas" e seus argumentos (potencialmente inseguros). Se <code>fun</code> estiver em strict mode, tanto <code>fun.caller</code> quando <code>fun.arguments</code> são propriedades não-deletáveis que lançam exceção quando definidas ou recuperadas:</p>
<pre class="brush: js">function restrita()
{
"use strict";
restrita.caller; // lança TypeError
restrita.arguments; // lança TypeError
}
function invocadorPrivilegiado()
{
return restrita();
}
invocadorPrivilegiado();
</pre>
<p>Terceiro, <code>arguments</code> para funções strict mode não oferecem mais acesso às variáveis da chamada de função correspondente. Em algumas implementações antigas do ECMAScript, <code>arguments.caller</code> era um objeto cujas propriedades faziam <em>alias</em> de variáveis naquela função. Isso é um <a href="http://stuff.mit.edu/iap/2008/facebook/">risco de segurança</a> porque quebra a habilidade de esconder valores privilegiados via abstração de função; isso também exclui a maioria das otimizações. Por essas razões, nenhum navegador moderno implementa isso. Ainda assim, por causa de sua funcionalidade histórica, <code>arguments.caller</code> para uma função strict mode também é uma propriedade não-deletável que lança exceção quando definida ou recuperada:</p>
<pre class="brush: js">"use strict";
function fun(a, b)
{
"use strict";
var v = 12;
return arguments.caller; // lança TypeError
}
fun(1, 2); // não expõe v (or a or b)
</pre>
<h3 id="Pavimentando_o_caminho_para_versões_futuras_do_ECMAScript">Pavimentando o caminho para versões futuras do ECMAScript</h3>
<p>Versões futuras do ECMAScript provavelmente introduzirão nova sintaxe, e o strict mode no ECMAScript 5 aplica algumas restrições para facilitar essa transição. Será mais fácil fazer algumas mudanças se as fundações dessas mudanças forem proibidas no strict mode.</p>
<p>Primeiro, no strict mode, uma pequena lista de identificadores tornam-se palavras-chave reservadas. Estas palavras são <code>implements</code>, <code>interface</code>, <code>let</code>, <code>package</code>, <code>private</code>, <code>protected</code>, <code>public</code>, <code>static</code> e <code>yield</code>. Em strict mode, portanto, você não pode nomear ou usar variáveis ou argumentos com esses nomes.</p>
<pre class="brush: js">function package(protected){ // !!!
"use strict";
var implements; // !!!
interface: // !!!
while (true){
break interface; // !!!
}
function private() { } // !!!
}
function fun(static) { 'use strict'; } // !!!
</pre>
<p>Duas ressalvas específicas à Mozilla: primeiro, se seu código for JavaScript 1.7 ou superior (por exemplo em código chrome ou usando o <code><script type=""></code> correto) e for strict mode, <code>let</code> e <code>yield</code> têm a funcionaldade que eles tiveram desde que essas palavras-chave foram introduzidas pela primeira vez. Mas código strict mode na web, carregado com <code><script src=""></code> ou <code><script>...</script></code>, não serão capazes de usar <code>let</code>/<code>yield</code> como identificadores. Segundo, enquanto o ES5 reserva incondicionalmente as palavras <code>class</code>, <code>enum</code>, <code>export</code>, <code>extends</code>, <code>import</code> e <code>super</code>, a Mozilla reservava-as apenas em strict mode antes do Firefox 5.</p>
<p>Segundo, <a href="http://whereswalden.com/2011/01/24/new-es5-strict-mode-requirement-function-statements-not-at-top-level-of-a-program-or-function-are-prohibited/">strict mode proíbe declaração de funções fora do nível superior de um script ou função</a>. Em código normal em navegadores, declarações de funções são permitidas "em todo lugar". <em>Isso não é parte do ES5 (nem do ES3)!</em> É uma extensão com semânticas incompatíveis em diferentes navegadores. Edições futuras do ECMAScript promissoramente especificarão novas semânticas para declarações de funções fora do nível superior de um script ou função. <a href="http://wiki.ecmascript.org/doku.php?id=conventions:no_non_standard_strict_decls">Proibir tais declarações de funções em strict mode</a> "limpa a mesa" para especificação em uma <em>release</em> futura do ECMAScript:</p>
<pre class="brush: js">"use strict";
if (true){
function f() { } // !!! erro de sintaxe
f();
}
for (var i = 0; i < 5; i++){
function f2() { } // !!! erro de sintaxe
f2();
}
function baz(){ // correto
function eit() { } // erro de sintaxe
}
</pre>
<p>Essa proibição não é adequada ao strict mode porque tais declarações de função são uma extensão de ES5 básico. Mas é a recomendação do comitê do ECMAScript e os navegadores a implementarão.</p>
<h2 id="Strict_mode_em_navegadores">Strict mode em navegadores</h2>
<p>Os principais navegadores agora implementam strict mode. Entretanto, não dependa deles cegamente já que ainda há <a href="http://caniuse.com/use-strict">várias versões de navegadores utilizadas por aí que têm apenas suporte parcial ao strict mode</a> ou que não suportam de forma alguma (ex.: Internet Explorer abaixo da versão 10!). <em>Strict mode muda semântica</em>. Depender dessas mudanças causará equívocos e erros em navegadores que não implementam strict mode. Tenha cautela ao usar strict mode e gere confiança no strict mode com testes de funcionalidades que verificam se partes relevantes do strict mode estão implementadas. Finalmente, certifique-se de <em>testar seu código em navegadores que suportam e não suportam strict mode. </em>Se você testar apenas em navegadores que não suportam strict mode, você provavelmente terá problemas em navegadores que suportam e vice-versa.</p>
<h2 id="Especificações">Especificações</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Especificação</th>
<th scope="col">Status</th>
<th scope="col">Comentário</th>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-10.1.1', 'Strict Mode Code')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Definição inicial. Veja também: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-C">Strict mode restriction and exceptions</a></td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-strict-mode-code', 'Strict Mode Code')}}</td>
<td>{{Spec2('ES6')}}</td>
<td><a href="http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript">Strict mode restriction and exceptions</a></td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-strict-mode-code', 'Strict Mode Code')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td><a href="https://tc39.github.io/ecma262/#sec-strict-mode-of-ecmascript">Strict mode restriction and exceptions</a></td>
</tr>
</tbody>
</table>
<h2 id="Veja_também">Veja também</h2>
<ul>
<li><a class="external" href="http://whereswalden.com/2010/09/08/new-es5-strict-mode-support-now-with-poison-pills/">Where's Walden? » New ES5 strict mode support: now with poison pills!</a></li>
<li><a class="external" href="http://whereswalden.com/2011/01/24/new-es5-strict-mode-requirement-function-statements-not-at-top-level-of-a-program-or-function-are-prohibited/">Where's Walden? » New ES5 strict mode requirement: function statements not at top level of a program or function are prohibited</a></li>
<li><a class="external" href="http://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval-code-are-local-to-that-code-only/">Where's Walden? » New ES5 strict mode support: new vars created by strict mode eval code are local to that code only</a></li>
<li><a href="http://qnimate.com/javascript-strict-mode-in-nutshell/">JavaScript "use strict" tutorial for beginners.</a></li>
<li><a class="external" href="http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/">John Resig - ECMAScript 5 Strict Mode, JSON, and More</a></li>
<li><a class="external" href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/">ECMA-262-5 in detail. Chapter 2. Strict Mode.</a></li>
<li><a class="external" href="http://kangax.github.io/compat-table/es5/#Strict_mode">Strict mode compatibility table</a></li>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Strict_mode/Transitioning_to_strict_mode">Transitioning to strict mode</a></li>
</ul>
|