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;
Foi útil?

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):

com - Mozilla Developer Center

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.

usos legítimos para a instrução "with" do javascript :D

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top