Широко известный символ Symbol.unscopables используется для указания значения объекта, чьи собственные и наследуемые имена свойств исключаются из привязок связанного объекта оператора with.

Атрибуты свойстваSymbol.unscopables
Записываемое нет
Перечисляемое нет
Настраиваемое нет

Описание

Символ @@unscopables (Symbol.unscopables)  может быть определён к любому объекту, чтобы исключить имена свойств из-за того, что они отображаются как лексические переменные с привязкой окружения with. Обратите внимание: если использовать "Строгий режим", оператор with будет недоступен и вероятнее всего также не понадобится этот символ.

Если Вы зададите свойству знаечние true в объекте unscopables  сделает его "unscopable" и, следовательно, оно не будет задействовано в области лексических переменных. Придав свойству значение false, Вы сделаете его scopable и, как следствие, оно будет задействовано в области лексических переменных.

Примеры

Приведённый код отлично работает в ES5 и ниже. Однако в ECMAScript 2015 и более поздних версиях был введён метод  Array.prototype.keys(). Это означает, что внутри окружения with, "ключи" будут методом, а не пременной. Вот где теперь встроенные свойства символа Array.prototype[@@unscopables] вступают в игру и препятствуют тому, чтобы некоторые из методов Array были включены в оператор with.

var keys = [];

with (Array.prototype) {
  keys.push('что-то');
}

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

Вы также можете задать unscopables для собственных объектов.

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
}

Спецификации

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Symbol.unscopables' в этой спецификации.
Стандарт Изначальное определение.
ECMAScript Latest Draft (ECMA-262)
Определение 'Symbol.unscopables' в этой спецификации.
Черновик  

Совместимость с браузерами

ВозможностьChromeEdgeFirefoxInternet ExplorerOperaSafari
Базовая поддержка38 Да48 Нет Да9
ВозможностьAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Базовая поддержка Да Да Да48 Да9 ?

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: fax1ty
 Обновлялась последний раз: fax1ty,