O que “com” faz em JavaScript?
-
22-09-2019 - |
Pergunta
Eu vi o código JavaScript que começa com with
.Isso é um pouco confuso.O que ele faz e como pode ser usado corretamente?
with (sObj) return options[selectedIndex].value;
Solução
Isso adiciona ao escopo das declarações contidas no bloco:
return sObj.options[selectedIndex].value;
pode se tornar:
with (sObj)
return options[selectedIndex].value;
No seu caso, não faz muito ... mas considere o seguinte:
var a, x, y;
var r = 10;
a = Math.PI * r * r;
x = r * Math.cos(PI);
y = r * Math.sin(PI /2);
Torna-se:
var a, x, y;
var r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
... economiza algumas teclas. A documentação da Mozilla realmente faz um bom trabalho ao explicar as coisas com um pouco mais de detalhes (junto com os prós e contras de usá -lo):
Outras dicas
a with
A declaração é pura açúcar sintático, mas também pode causar alguns bugs desagradáveis.
Ver com declaração considerada prejudicial Para esclarecimento:
Se você não consegue ler um programa e estar confiante de que sabe o que ele vai fazer, não pode ter confiança de que ele funcionará corretamente. Por esse motivo, o
with
A declaração deve ser evitada.
Nesse bloco, você não precisa digitar:
sObj.options[selectedIndex].value
Mas você pode simplesmente usar:
options[selectedIndex].value
É o equivalente a
return sObj.options[selectedIndex].value;
With
permite emitir um bloco de instruções no contexto de um objeto específico.Portanto, todas as afirmações do with
bloco são considerados membros do objeto entre parênteses.
Isso pode tornar o código mais legível às vezes, mas também pode levar à ambiguidade, uma vez que as referências de variáveis podem ser com sObj ou globais.
Eu recomendaria não usar isso devido a problemas de desempenho, mas o que o acima significa é:
para o objeto Sobj (aqui presumivelmente um elemento selecionado), todas as crianças e propriedades mencionadas neste (ou entre os seguintes aparelhos encaracolados) tratam isso como escopo dos pais.
Seu exemplo pode ser reescrito como ...
return sObj.options[selectedIndex].value;
... como a declaração 'com' coloca todas as declarações relacionadas no escopo do objeto fornecido. Nesse caso, é bastante inútil, mas, se você estava fazendo muitas operações no 'Sobj', isso economiza muita digitação.
Exemplo totalmente fictício ..
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
Mas, tendo dito isso, geralmente é o caso de economizar digitação pode ser alcançada de maneiras melhores.
Não é uma função (como foi indicado no título da pergunta antes de ser editado), mas uma declaração. Pode fazer mais sentido se a amostra de código for formatada assim:
with (sObj){
return options[selectedIndex].value;
}
Sobre o que faz (Fonte)
A instrução com estabelece o objeto padrão para um conjunto de instruções. O JavaScript procura nomes não qualificados no conjunto de instruções para determinar se os nomes são propriedades do objeto padrão. Se um nome não qualificado corresponder a uma propriedade, a propriedade será usada na instrução; Caso contrário, uma variável local ou global é usada.
O que significa que na amostra de código é verificada pela primeira vez se options
é uma propriedade de sObj
. Se for então options
refere-se a sObj.options
, caso contrário, ele verifica outros escopos para uma variável definida pelo nome options
A desvantagem de usar um with
A declaração é que é impossível saber apenas olhando para o código o que é acessado. Existem outras alternativas melhores, como mostrado em Este artigo