Symbol.unscopables
Широко известный символ 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
}
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-symbol.unscopables |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Array.prototype[@@unscopables]
- оператор
with
(не доступен в режиме Strict)