Descontinuar recursos em JavaScript é raro. Apenas um recurso na história da linguagem foi oficialmente descontinuado: declarações ‘with’ .
A declaração ‘with’ foi introduzida no início da história do JavaScript. Seu propósito era simplificar o trabalho com objetos fornecendo um atalho para acessar propriedades de objetos.
const car = {
make: 'Toyota',
model: 'Corolla',
year: 2020
};
with (car) {
console.log(make); // Toyota
console.log(model); // Corolla
console.log(year); // 2020
}
A instrução ‘with’ permite que você acesse as propriedades do objeto car diretamente, sem precisar digitar car.make , car.model e car.year .
Por que o Was with foi descontinuado?
O problema principal era a ambiguidade. Como a declaração with modifica o escopo, ficou difícil para os desenvolvedores e mecanismos JavaScript saberem a quais variáveis ou propriedades estavam sendo referenciadas.
O que esse código imprimirá?
const car = {
make: 'Toyota'
};
function showMake() {
const make = 'Honda';
with (car) {
console.log(make);
}
}
showMake();
Ele imprimirá ‘Toyota’ do objeto car, ou ‘Honda’ do escopo da função showMake ? A ambiguidade aqui é o problema. Isso poderia facilmente levar a bugs difíceis de rastrear.
A resposta: ‘Toyota’
A instrução with estende a cadeia de escopo, então quando with (car) é usado, ela efetivamente coloca as propriedades do objeto car no escopo.
Na função showMake , quando console.log(make) é chamado dentro do bloco with (car), o JavaScript primeiro procura por make dentro do objeto car. Como car tem uma propriedade make com o valor ‘Toyota’, ele a encontra primeiro e imprime ‘Toyota’.
Se o objeto car não tivesse uma propriedade make, o JavaScript procuraria por make no escopo ao redor, onde encontraria o valor ‘Honda’. Mas, neste caso, como car tem uma propriedade make, ‘Toyota’ é impresso.
Onde estamos hoje (2024)
A declaração with ainda faz parte do JavaScript hoje, mas é considerada uma prática ruim. Pode causar comportamento confuso e imprevisível.
Isso acontece porque ele altera a cadeia de escopo, dificultando dizer quais variáveis estão sendo usadas. Essa ambiguidade pode levar a bugs difíceis de encontrar.
Por esses motivos, é melhor evitar usar with no seu código.
Como evitar usar com
Em vez de usar with , você deve referenciar propriedades de objeto diretamente. Se estiver tentando encurtar a sintaxe, considere usar destructuring:
const car = {
make: 'Toyota',
model: 'Corolla',
year: 2020
};
// Destructuring assignment
const { make, model, year } = car;
console.log(make); // Toyota
console.log(model); // Corolla
console.log(year); // 2020
Este código atinge um efeito similar à declaração ‘with’, mas sem as armadilhas. A desestruturação é clara, inequívoca e amplamente suportada em JavaScript.
A instrução ‘with’ é frequentemente citada como o único recurso obsoleto em JavaScript, mas isso não é totalmente verdade.
Embora seja um dos recursos obsoletos mais proeminentes e conhecidos, ele não está sozinho. Outros recursos, como arguments.callee no modo estrito e certos usos de eval() , também enfrentaram depreciação ou forte desencorajamento.