Symbol.unscopables

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. 

Descriçã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
Writable no
Enumerable no
Configurable no

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.

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.

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

Compatibilidade de navegadores

BCD tables only load in the browser

Veja também