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

View in English Always switch to English

Symbol.unscopables

Deprecated

Avoid using this feature in new projects. JavaScript strict mode prohibits the with statement. This feature may be a candidate for removal from web standards or browsers.

Consider using the following features instead: Destructuring.

O símbolo Symbol.unscopables é usado para específicar um valor objeto cujo os nomes de propriedade próprio e herdados são excluídos das associações do ambiente with o objeto associado.

Experimente

const object1 = {
  property1: 42,
};

object1[Symbol.unscopables] = {
  property1: true,
};

with (object1) {
  console.log(property1);
  // Expected output: Error: property1 is not defined
}

Descrição

O @@unscopables símbolo (Symbol.unscopables) pode ser definido em qualquer objeto para impedir que os nomes da propriedade sejam expostos como variavéis lexicais with ligações de ambiente. Note que se usar o Strict mode, with as declarações não estão disponíveis e provavelmente não haverá necessidade desse símbolo.

Configurando a propriedade para true em um objeto unscopables tornará ele não unscopable e portanto não irá apareer nas variavéis de escopo lexicais. Configurando uma propriedade para false o tornará scopable e portanto irá aparecer no escopo de variavéis lexicais.

Property attributes of Symbol.unscopables
Writableno
Enumerableno
Configurableno

Exemplos

Escopo com declarações

O seguinte código funciona normalmente no ES5 e anteriores. Entretanto, no ECMAScript 2015 e superiores, o método Array.prototype.keys() foi introduzido. Isso significa que dentro do ambiente with "chaves" seria agora o método e não as variavéis. Isso qunado os símbolos unscopables foram introduzidos. Uma confiração built-in unscopables é implementada como Array.prototype[@@unscopables] para prevenir que alguns métodos de Array tenham escopo definido na desclaração with.

js
var keys = [];

with (Array.prototype) {
  keys.push("something");
}

Object.keys(Array.prototype[Symbol.unscopables]);
// ["copyWithin", "entries", "fill", "find", "findIndex",
//  "includes", "keys", "values"]

Objetos não escopáveis

Você também pode configurar unscopables para seu próprio objeot.

js
var obj = {
  foo: 1,
  bar: 2,
};

obj[Symbol.unscopables] = {
  foo: false,
  bar: true,
};

with (obj) {
  console.log(foo); // 1
  console.log(bar); // ReferenceError: bar is not defined
}

Especificações

Specification
ECMAScript® 2027 Language Specification
# sec-symbol.unscopables

Compatibilidade com navegadores

Veja também