Pular para o conteúdo principal

JS - use strict

Diretiva que tem como objetivo controlar o escopo de variáveis, prevenindo que as variáveis sejam criadas de forma global, ou seja, que as variáveis possam impactar em escopos que não lhes dizem respeito, em resumo ele bloqueia declarações sem o "var".

Para usar essa diretiva basta incluir a "string" 'use strict' no inicio do escopo que se deseja controlar, vamos aos exemplos:

(function(){
  var teste1 = 'abc';
  teste2 = 'def';
})();

console.log(teste1); //gera erro pois não pertence a esse escopo
console.log(teste2); //mostra o valor pois pertence ao escopo global


Para prevenir o problema:

(function(){
  'use strict';
  var teste3 = 'abc';
  teste4 = 'def'; //aqui já ocorre o erro
})();



with

Esse comando cria um escopo que nos permite acessar propriedades de um objeto de forma direta. Por convenção seu uso é desaconselhável por poder gerar problemas com outras variáveis, logo o 'use strict' previne o uso do "with":

(function(){

  var pessoa = {
nome: 'Adamastor',
profissao: {
titulo: 'Analista',
graduacao: {
instituicao: 'Faculdade Joinha',
ano: 2000
}
}
  };
  
  console.log('Sem with', pessoa.profissao.graduacao.instituicao, pessoa.profissao.graduacao.ano);
  
  with(pessoa.profissao.graduacao) {
console.log('Com with', instituicao, ano);
  }
})();


Com o 'use strict' temos uma mensagem de erro prevenindo o uso do "with":



Impede o o uso do "this"

O 'use strict' torna o "this" "undefined", isso para prevenir enganos que possam criar variáveis no escopo global.

Anteriormente exemplificamos a criação de objetos por meio do conceito de "construtores" usando o "new", o construtor nada mais é que uma função, porém se essa função for chamada sem o "new" e ela estiver fazendo uso do "this" podemos acabar com variáveis globais indesejáveis:

(function(){
  function Carro(marca, cor) {
     this.marca = marca;
     this.cor = cor;
  }

  console.log(new Carro('Fiat', 'Prata')); // uso correto
})();
console.log(marca); // aqui temos um erro pois a variável não existe



Agora o erro

(function(){
  function Carro(marca, cor) {
     this.marca = marca;
     this.cor = cor;
  }

  console.log(Carro('Fiat', 'Prata')); // uso errado, agora temos variáveis globais
})();
console.log(marca); // mostra o valor da variável global



Para prevenir o erro basta usar o 'use strict'



Outras validações

O 'use strict' ainda previne algumas práticas ruins, como por exemplo o uso do "delete" em situações inválidas, o "delete" é usado para apagar propriedades de objetos, se tentarmos usa-lo para apagar uma variável comum ele não funciona logo o 'use strict' bloqueia essa prática. Ele também previne o uso de nomes repetidos para propriedades de um objeto e de argumentos para uma função:

(function(){
  'use strict';
  var teste = 'teste';
  var obj = { prop1: 'prop1', prop2: 'prop2'};
  console.log(delete obj.prop1, obj); // OK, apaga a propriedade
  console.log(delete teste, teste); // ERRO
})();

(function(){
  'use strict';
  var teste = 'teste';
  var obj = { prop1: 'prop1', prop1: 'prop2'}; // ISSO DEVERIA DAR ERRO, MAS AQUI TEMOS UM BUG
})();

(function(){
  'use strict';
  function soma(a, a) {
    return a + a;
  }
})();




Comentários

Mais visitadas

Lista de políticos com ficha suja

ATUALIZAÇÃO (08/03/2012 ano de eleição) Representantes de duas pessoas da lista (Eliseu Padilha e Alex Canziani) entraram em contato e pediram que esses fossem removidos, alegando que não houve condenação. É justo essa requisição, porém vale lembrar que escândalos nacionalmente reconhecidos de corrupção não deram em nada, por isso o que realmente conta nesse ano de eleição é uma pesquisa minuciosa sobre os candidatos escolhidos, eu particularmente, por não estar nem um pouco satisfeito, não irei votar em ninguém que já tenha sido eleito. Estou voltando a postar por um motivo nobre, meu tempo continua apertado mas esse post é rápido, na verdade nem meu ele é (visitem o espaço de nosso amigo Lord ), estou apenas repassando essa valiosa informação. Teremos eleição esse ano, e é importante não repetirmos erros passados, vamos ficar atentos em relação a esses nomes e exclui-los de vez do cenário politico nacional. Façamos nossa parte, publicando em nossos blog...

Listar arquivos existentes em diretório (Delphi)

Mostraremos uma maneira simples e prática para listar o conteúdo de um diretório com a opção de incluir nessa listagem os arquivos de seus subdiretórios. No exemplo abaixo temos um Edit para receber o diretório a ser pesquisado um CheckBox para indicar se os subdiretórios entrarão na pesquisa um botão para efetuar a pesquisa e um Memo para listar os arquivos encontrados, no final um Edit que receberá o cálculo final (em bytes) da soma do tamanho dos arquivos. procedure TForm1.Button1Click(Sender: TObject); begin   tamanhoTotal := 0;   memLista.Lines.Clear;   ListarArquivos(edtDiretorio.Text, chkSub.Checked);   Edit1.Text := IntToStr( tamanhoTotal ); end; procedure TForm1.ListarArquivos(Diretorio: string; Sub:Boolean); var   F: TSearchRec;   Ret: Integer;   TempNome: string; begin   Ret := FindFirst(Diretorio+'\*.*', faAnyFile, F);   try     while Ret = 0 do ...

Como pegar valor de coluna invisível do GridView

Em determinado momento nos deparamos com a seguinte situação, nossa tabela do banco de dados possui como campo chave, um ID por exemplo, incrementado por uma rotina da aplicação, do banco ou algum outro mecanismo de incremento (sequences, increment, etc), logo não há porque mostrar essa coluna para o usuário porque o mesmo não sabe de sua existência, e seu valor não tem qualquer relevância para ele, sendo assim o mais lógico a se fazer é não mostra-lá na aplicação. Seu valor é necessário já que por se tratar de uma chave primária precisaremos dela para atualizar, inserir ou excluir os dados, então o que fazer? A resposta seria simples, deixemos ele invisível, buscaremos seu valor e o usuário não perceberá, porém a partir da versão 2005 do visual Studio as colunas setadas com "visible = false" não são renderizadas, com isso ao se tentar acessar seu valor o que recebemos é nada. Para contornarmos essa situação podemos codificar o seguinte: protected void GridView1_R...