Symbol.unscopables

Esta tradução está incompleta. Ajude a traduzir este artigo em inglês

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

Especificação
ECMAScript (ECMA-262)
The definition of 'Symbol.unscopables' in that specification.

Compatibilidade de navegadores

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
unscopablesChrome Full support 45Edge Full support 12Firefox Full support 48IE No support NoOpera Full support 32Safari Full support 9WebView Android Full support 45Chrome Android Full support 45Firefox Android Full support 48Opera Android Full support 32Safari iOS Full support 9Samsung Internet Android Full support 5.0nodejs Full support 0.12

Legend

Full support  
Full support
No support  
No support

Veja também