--- title: Symbol.unscopables slug: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables tags: - ECMAScript6 - JavaScript - Property - Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables ---
Широко известный символ Symbol.unscopables
используется для указания значения объекта, чьи собственные и наследуемые имена свойств исключаются из привязок связанного объекта оператора with
.
Символ @@unscopables
(Symbol.unscopables
) может быть определён к любому объекту, чтобы исключить имена свойств из-за того, что они отображаются как лексические переменные с привязкой окружения with
. Обратите внимание: если использовать "Строгий режим", оператор with
будет недоступен и вероятнее всего также не понадобится этот символ.
Если Вы зададите свойству знаечние true
в объекте unscopables
сделает его "unscopable" и, следовательно, оно не будет задействовано в области лексических переменных. Придав свойству значение false
, Вы сделаете его scopable
и, как следствие, оно будет задействовано в области лексических переменных.
Приведённый код отлично работает в ES5 и ниже. Однако в ECMAScript 2015 и более поздних версиях был введён метод {{jsxref("Array.prototype.keys()")}}. Это означает, что внутри окружения with
, "ключи" будут методом, а не пременной. Вот где теперь встроенные свойства символа {{jsxref("Array.@@unscopables", "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 }
Спецификация | Статус | Комментарий |
---|---|---|
{{SpecName('ES2015', '#sec-symbol.unscopables', 'Symbol.unscopables')}} | {{Spec2('ES2015')}} | Изначальное определение. |
{{SpecName('ESDraft', '#sec-symbol.unscopables', 'Symbol.unscopables')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Symbol.unscopables")}}
with
(не доступен в режиме Strict)