O uso da declaração with não é recomendado, isso porque ele pode ser a fonte de bugs confusos e problemas de compatibilidade. Veja o parágrafo "Contra de ambiguidade" na seção "Descrição" para mais detalhes.

A declaração with extende a cadeia de escopo para uma declaração.

Sintaxe

with (expressão)
  declaração
expressão
Adiciona a dada expressão a cadeia de escopo quando estiver avaliando a declaração. O parênteses em volta da expressão é obrigatório.
declaração
Qualquer declaração. Para executação multiplas declarações, utilize a declaração em bloco ({ ... }) para agrupar estas declarações.

Descrição

JavaScript procura por um nome não qualificado procurando uma cadeia de escopo associada a execução do contexto do script ou função contendo um nome não qualificado. A declaração 'with' adiciona o dado objeto acima dessa cadeia de escopo durante a validação desse corpo de declarações. Se um nome não qualificado usado no corpo for igual a de uma propriedade na cadeia de escopo,  então o nome ficará ligado a propriedade e ao objeto contendo a propriedade. Se não um ReferenceError será invocado.

Usar with não é recomendado, e está probido no strict mode do ECMAScript 5. A alternativa recomendada é atribuir ao objeto as propriedade cujo você quer acessar em uma variável temporária

Pros & contras de perfomance

Pro: A declaração with pode ajudar o tamanho do arquivo por reduzir a necessidade de repetir a referência a um objeto longo sem penalidade na perfomance. A cadeia de escopo mudada por um 'with' não é computacionalmente cara. O uso de 'with' irá aliviar o interpretador de tratar repetidamente as referências. Note que, no entando, isso em muitos casos pode ser substituído usando uma variável temporária para armazenar a referência do objeto desejado.

Contra: A declaração with força que o objeto especifícado a ser procurado primeiro por pesquisas de nome. Assim sendo, todos os indentificadores que não são membros do objeto espeficícado vão ser encontrados mais lentamente em um bloco 'with'. Onde a perfomance é importande, 'with' deve ser usado apenas para englobar blocos de código que acessam membros de um objeto especifíco.

Contra de ambiguidade

Contra: A declaração with faz ser difícil para um leitor humano ou compilador JavaScript decidir se um nome não qualificado var se encontrado em uma cadeia de escopo, e também, em qual objeto. Dado o exemplo seguinte:

function f(x, o) {
  with (o) {
    console.log(x);
  }
}

Apenas quando f é chamado é x ou encontrado ou não, e se for encontrado, ou no o ou (se nenhuma propriedade existir) na ativação do objeto de f, onde o nome de x é o primeiro argumento forma. Se você esquecer de definir x no objeto que você passou como segundo argumento, ou se há algum bug similar ou confusão, você não vai receber um erro -- apenas resultados inesperados.

Contra: Código utilizando with talvez não seja compatível em diante, especialmente quando usado com algum outro que não seja um objeto simplest. Considere esse exemplo:

function f(foo, values) {
  with (foo) {
    console.log(values);
  }
}

Se você chamar f([1,2,3], obj) em um ambiente ECMAScript 5, então a referência de values dentro da declaração with irá ser obj. No entando, ECMAScript 6 introduz uma propriedade values no Array.prototype (então isso estará disponível em todas as arrays). Então, em um ambiente JavaScript que suporta ECMAScript 6, a referência de values dentro da declaração with irá ser [1,2,3].values.

Exemplos

Usando with

A seguinte declaração with irá especificar que o objeto Math é o objeto padrão. As seguintes declarações seguindo a declaração with irão referir a propriedade PI e aos métodos cossin, sem especificar um objeto. JavaScript assume o objeto Math para essas referências.

var a, x, y;
var r = 10;

with (Math) {
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}

Especificações

Especificação Situação Comentário
ECMAScript Latest Draft (ECMA-262)
The definition of 'with statement' in that specification.
Padrão em tempo real  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'with statement' in that specification.
Padrão  
ECMAScript 5.1 (ECMA-262)
The definition of 'with statement' in that specification.
Padrão Agora proibido no modo estrito.
ECMAScript 3rd Edition (ECMA-262)
The definition of 'with statement' in that specification.
Padrão  
ECMAScript 1st Edition (ECMA-262)
The definition of 'with statement' in that specification.
Padrão Definição inicial

Compatibilidade de navegadores

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Veja também

Etiquetas do documento e colaboradores

 Colaboradores desta página: alefesouza
 Última atualização por: alefesouza,