Movatterモバイル変換


[0]ホーム

URL:


  1. Tecnologia Web para desenvolvedores
  2. JavaScript
  3. Referência JavaScript
  4. Instruções e declarações
  5. with

Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.

View in EnglishAlways switch to English

with

Aviso:O uso da declaraçãowith 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.

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

Sintaxe

with (expressão)  declaração
expressão

Adiciona a dada expressão à 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 embloco ({ ... }) para agrupar estas declarações.

Descrição

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

Nota:Usarwith não é recomendado, e está probido nostrict mode do ECMAScript 5. A alternativa recomendada é atribuir o objeto cujas propriedades você quer acessar a uma variável temporária.

Pros & contras de perfomance

Pro: A declaraçãowith 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çãowith 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çãowith 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:

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

Apenas quandof é chamado éx ou encontrado ou não, e se for encontrado, ou emo ou (se nenhuma propriedade existir) no objeto de ativação def, onde o nome dex é o primeiro argumento formal. Se você esquecer de definirx 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 utilizandowith talvez não seja compatível posteriormente, especialmente quando usado com algo que não seja um objeto simples. Considere esse exemplo:

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

Se você chamarf([1,2,3], obj) em um ambiente ECMAScript 5, então a referência devalues dentro da declaraçãowith irá serobj. No entando, ECMAScript 6 introduz uma propriedadevalues noArray.prototype (então isso estará disponível em todas as arrays). Então, em um ambiente JavaScript que suporta ECMAScript 6, a referência devalues dentro da declaraçãowith irá ser[1,2,3].values.

Exemplos

Usandowith

A seguinte declaraçãowith irá especificar que o objetoMath é o objeto padrão. As seguintes declarações seguindo a declaraçãowith irão referir a propriedadePI e aos métodoscos esin, sem especificar um objeto. JavaScript assume o objetoMath para essas referências.

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

Especificações

Specification
ECMAScript® 2026 Language Specification
# sec-with-statement

Compatibilidade com navegadores

Veja também

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp