Modo estrito Is Coming To Town
Dezembro 14, 2010 às 2:12 pm por Douglas Crockford | Em Desenvolvimento | 20 ComentáriosEste é o tempo e época em que pessoas de todo o mundo esquecer suas diferenças e se unirem em paz e comunhão para celebrar o primeiro aniversário da aprovação do ECMA Assembleia Geral da programação ECMAScript Idioma Standard Edition, Quinta. A característica mais importante na ES5 é o novo modo Strict. Modo Strict é um modo de opt-in que os reparos ou remove algumas das características mais problemáticas da língua.
Especificando o modo estrito
Há duas maneiras de solicitar modo estrito. O primeiro é a inserir este pragma
"Use strict"; na parte superior de um ficheiro ou unidade de compilação. Deve aparecer antes de quaisquer outras declarações, mas pode ser precedido por espaço em branco e comentários. Ele tem a forma de uma declaração literal cadeia inútil, por isso vai ser ignorado pelo ES3 sistemas. Isto significa que é possível escrever ES5/strict programas que podem rodar também no navegadores mais antigos. Estrito código também pode interagir com código não-estrita (ou desleixado), assim funções estritas pode chamar funções desleixado, e funções desleixado pode chamar funções estritas. Este alto nível de compatibilidade faz adoção de modo estrito fácil.
Todo o código no arquivo ou unidade de compilação com o "use strict"; preâmbulo será processado como um código estrito. Há um problema, no entanto. considerações de desempenho actualmente obrigam-nos a concatenar arquivos JavaScript muitos juntos para evitar atrasos HTTP cumulativos. Se um arquivo com um "use strict"; preâmbulo tem o código desleixado anexado a ela, o código desleixado será processado como rigoroso e provavelmente irá falhar. Existe uma regra simples: Não misture rigorosa e desleixada no mesmo arquivo, mas já vimos alguns sites famosos se esta errado.
A segunda maneira é inserir o pragma é como a primeira declaração de uma função. Que declara que toda a função será rigorosa, incluindo as funções que estão aninhados dentro dele. Rigor âmbito função aspectos, código de modo rigoroso e código banal pode ser misturado no mesmo arquivo. Esta segunda forma funciona muito bem com o Módulo padrão e suas muitas variações. A segunda forma é preferida porque evita o risco de concatenação.
(Function () { "Use strict"; / / Esta função é rigorosa ... } ()); (Function () { / / Mas esta função é desleixado ... } ());
Escopo
Historicamente, JavaScript tem sido confundido sobre como as funções são escopo. Às vezes, eles parecem ser estaticamente escopo, mas algumas características fazem com que se comportem como eles são dinamicamente escopo. Isso é confuso, tornar os programas difíceis de ler e entender. Mal-entendido faz com bugs. Também é um problema para o desempenho. Escopo estático permitiria variável de ligação a acontecer em tempo de compilação, mas a exigência de alcance dinâmico, a ligação deve ser adiada para a execução, que vem com uma penalidade de desempenho significativo.
Modo estrito requer que toda a vinculação variável ser feitas de forma estática. Isso significa que os recursos que antes exigiam ligação dinâmicas devem ser eliminados ou modificados. Especificamente, o com a afirmação é eliminado, eo eval capacidade função de mexer com o ambiente do seu chamador é severamente restrito.
Um dos benefícios do código estrito é que ferramentas como o YUI Compressor pode fazer um trabalho melhor quando processá-lo.
Implícitas variáveis globais
JavaScript tem implicado variáveis globais. Se você não declarar explicitamente uma variável, uma variável global é declarada implicitamente para você. Isso faz com que a programação mais fácil para iniciantes, pois eles podem negligenciar algumas de suas tarefas domésticas básicas. Mas faz a gestão dos programas de maior dimensão muito mais difícil e degrada significativamente a confiabilidade. Assim, no modo estrito, implícitas variáveis globais não são mais criados. Você deve declarar explicitamente todas as suas variáveis.
Fuga global
Há um certo número de situações que podem causar this a ser ligado ao objecto global. Por exemplo, se você esquecer de fornecer o new prefixo ao chamar uma função de construtor, o construtor é this ficará obrigado inesperadamente para o objeto global, então ao invés de inicializar um novo objeto, ele vai estar em silêncio em vez adulteração de variáveis globais. Nessas situações, o modo estrito, ao contrário, ligar this ao undefined , o que fará com que o construtor para lançar uma exceção em vez, permitindo que o erro seja detectado mais cedo.
Falha Noisy
JavaScript sempre teve propriedades somente leitura, mas você não podia criá-los até ES5 de Object.createProperty função exposta essa capacidade. Se você tentou atribuir um valor a uma propriedade somente leitura, seria falha silenciosamente. A atribuição não iria mudar o valor da propriedade, mas o programa continuaria como se tivesse. Este é um risco de integridade que pode causar programas para entrar em um estado inconsistente. No modo estrito, a tentativa de alterar uma propriedade somente leitura irá lançar uma exceção.
Octal
A representação octal (ou base 8) de números foi extremamente útil quando se faz a nível de máquina de programação em máquinas cuja palavra tamanhos foram um múltiplo de 3. Você precisava octal ao trabalhar com o CDC 6600 mainframe, que tinha um tamanho de palavra de 60 bits. Se você pudesse ler octal, você pode olhar para uma palavra como 20 dígitos. Dois dígitos representava o código operatório, e um um dígito identificado de 8 registros. Durante a lenta transição de códigos de máquina para linguagens de alto nível, ele foi pensado para ser útil para fornecer formas octais em linguagens de programação.
Em C, uma representação extremamente infeliz de octalness foi selecionado: zero à esquerda. Assim, em C, 0100 significa 64 não, 100, e 08 é um erro não, 8. Ainda mais infelizmente, esse anacronismo foi copiado em quase todas as línguas modernas, incluindo JavaScript, onde ele só é usado para criar erros. Ele não tem outra finalidade. Assim, no modo estrito, formas octais não são mais permitidas.
Et cetera
O arguments pseudo matriz torna-se um pouco mais de array como no ES5. No modo estrito, ela perde o seu callee e caller propriedades. Isso torna possível para passar seus arguments para código não confiável, sem dar um monte de contexto confidencial. Além disso, o arguments propriedade de funções é eliminada.
No modo estrito, chaves duplicadas em uma função literal irá produzir um erro de sintaxe. Uma função não pode ter dois parâmetros com o mesmo nome. Uma função não pode ter uma variável com o mesmo nome de um dos seus parâmetros. Uma função não pode delete as suas próprias variáveis. Uma tentativa de delete uma propriedade não-configurável agora lança uma exceção. Os valores primitivos não são implicitamente envolvido.
Se o seu programa passa JSLint , provavelmente vai funcionar no modo estrito.
Ainda é um mundo imperfeito
Há ainda problemas no JavaScript que modo estrito não aborda. Por exemplo, vírgula inserção ainda um perigo, e 0,1 + 0,2 ainda não é igual a 0,3. A correcção destes problemas terá que esperar para futuras edições.
Por Matéria modo estrito
Além dos benefícios óbvios para a confiabilidade do programa e facilitar a leitura, modo estrito está ajudando a resolver o problema Mashup. Nós queremos ser capaz de convidar código de terceiros em nossas páginas para fazer coisas úteis para nós e para nossos usuários, que sem dar o código de licença para assumir o browser ou para falsear a própria para o usuário ou os nossos servidores. Nós precisamos restringir o código de terceiros. Sistemas como Caja Google fazer isso, mas a um custo significativo no desempenho e inconveniência. Minha própria ADsafe sistema também faz isso, mas ao custo de eliminar this e [] subscrito a partir da linguagem, que pode tornar difícil a adopção. Modo estrito nos permite tornar o código de terceiros com a conveniência eo desempenho de ADsafe e da expressividade da Caja. Isso será muito importante como os nossos sites se tornam mais complexos e mais conectado.
Modo estrito não resolve o problema XSS. A solução para esse problema depende W3C tomar alguma ação positiva .
ES5/strict está agora em pré-estréias, e em breve será equipamento de série em todos os navegadores compatíveis com padrões em todos os lugares.
Compartilhar e ampliar: Bookmark com del.icio.us | digg it! | reddit!
20 Comentários
Desculpe, o formulário de comentários está fechado no momento.

Copyright © 2006-2012 Yahoo! Inc. Todos os direitos reservados. Política de Privacidade - Termos de Serviço
Powered by WordPress no Yahoo! Web Hosting .

como pós impressionante usual! ES5 é o futuro .. Object.create (), Object.defineProperty (), Object.isExtensible (), Array.isArray (), suporte nativo para JSON são excelentes recursos .. verificar ADsafe, parece promissor
Comentário por Sebastiano Armeli - 14 de dezembro de 2010 #
Se arguments.callee está fora, há uma outra maneira de fazer referência a um lambda de seu corpo?
Comentário por Arieh - 15 de dezembro de 2010 #
Há algum navegadores (beta ou não) que são compatíveis modo totalmente rigoroso?
Comentário por Nate - 15 dezembro de 2010 #
@ Arieh, sim -
var carl = function bob(a) {
if (!a) { bob(1); } // reference scoped to inside this function
alert(carl === bob); // gotcha - true in all browsers but false in ie...
};
Comentário por Chris - 15 de dezembro de 2010 #
Arieh: Você pode nomear expressões de função e se referem a eles por esse nome. por exemplo
var x = function lookMaNoYCombinator(a, b) { if (a === 0) return a + b; else return lookMaNoYCombinator(a - 1, b) }Comentário por Sami Samhuri - 15 de dezembro de 2010 #
@ Arieh: você deve estar usando um lambda chamado se você quiser recurse. por exemplo. (Função f () {f ()}). Isso também tem a vantagem de não ligações Argumentos opor-se | este |
Comentário por Oliver - 15 de dezembro de 2010 #
@ Nate: nightly builds do WebKit e Firefox devem ambos ser compatível com o modo estrito, e que todos nós apreciamos erros sendo arquivado, se você encontrar algum (a http://bugs.webkit.org e http://bugs.mozilla.org)
Comentário por Oliver - 15 de dezembro de 2010 #
Um gráfico mostrando grande ES5 compatibilidade em vários navegadores pode ser encontrado aqui: http://kangax.github.com/es5-compat-table/
Comentário por Jimmy - 15 de dezembro de 2010 #
'Com' e injetando eval realmente não implementar ligação dinâmica . Mesmo ES3 completo usa vinculação lexical (embora não necessariamente ligação estática) em todos os casos. Esses recursos foram certamente confundindo, no entanto.
Comentário por David Hopwood-Sarah - 16 de dezembro de 2010 #
Olá Douglas,
Resumo Bom, obrigado. Além disso, tenho certeza que os leitores vão se interessar pela descrição detalhada modo estrito: http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/
PS: um par de adições / correções:
É OK ter uma declaração de variável com o mesmo nome como um dos argumentos. Tecnicamente, a declaração será apenas ignorado, pois ele já declarou através da ligação argumento.
Era sempre assim - variáveis (exceto daqueles que criou usando
evalcontexto) têm sempre {} DontDelete em ES3 / [[configurável]] = false na ES5. Ou seja, não é possível excluir uma variável independente do modo estrito.Dmitry.
Comentário por Dmitry A. Soshnikov - 17 de dezembro de 2010 #
Será YUI3 adicionar "use strict" para seus módulos?
Comentário por David - 17 dez 2010 #
Oi Douglas,
Estou confuso sobre abaixo uma declaração do seu post.
"Modo estrito requer que toda a vinculação variável ser feitas de forma estática. Isso significa que os recursos que antes exigiam ligação dinâmicas devem ser eliminados ou modificados "
palavra-chave "this" - Será que ela tem ligação dinâmica de ligação ou lexical (estático)?
Se está a ter ligação dinâmica, você quer dizer que devemos parar de usar "isto" no modo estrito?
Estou muito confuso. Eu comecei a aprender JavaScript de um mês passado, de suas apresentações de vídeo. Eles são muito, muito útil. Esta é a minha primeira linguagem de programação. Pode ser a minha dúvida é muito estranho aqui.
Mas só quero ouvir de você em dúvida "isto".
Obrigado
Comentário por ekanna - 28 de dezembro de 2010 #
No modo estrito, a forma se liga este método para o objeto como antes. A forma, função liga-se a este indefinido, e não o objeto global.
Comentário por Douglas Crockford - 29 dez 2010 #
Dmitry, você acabou de descrever o caso em que você pode fazer as variáveis que você pode apagar! A sintaxe do operador delete permite variáveis exatamente para aquele caso. Mas não mais.
E David, Sarah, os cabelos você está dividindo são bastante curto.
Comentário por Douglas Crockford - 29 dez 2010 #
Obrigado Douglas.
Comentário por ekanna - 07 de janeiro de 2011 #
Pode querer corrigir erro de digitação "Falha Noisy" seção "CreateProperty" deve ser "DefineProperty".
Comentário por Travis - 11 de janeiro de 2011 #
"Estritamente awesome"
Comentário por franz enzenhofer - 13 de janeiro de 2011 #
Crockford rockz!
Comentário por Marc Draco - 20 janeiro de 2011 #
Assim, quando vai YUI Compressor parar de deixar cair o "uso restrito"; pragma a partir do código durante minifaction? :)
Comentário por marcoos - 03 de fevereiro de 2011 #
s minifaction / / minification /
Comentário por marcoos - 03 de fevereiro de 2011 #