--- title: Symbol.unscopables slug: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables tags: - ECMAScript 2015 - JavaScript - Symbol - Властивість - Символ translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables ---
{{JSRef}}

Добревідомий символ Symbol.unscopables використовується, щоб визначити об'єкт, чиї імена особистих та успадкованих властивостей виключаються з прив'язок оточення with для асоційованого об'єкта.

{{EmbedInteractiveExample("pages/js/symbol-unscopables.html")}}

Опис

Символ @@unscopables (Symbol.unscopables) можна визначити на будь-якому об'єкті, щоб запобігти розкриттю імен властивостей в якості лексичних змінних у прив'язках оточення with. Зауважте, що при використанні строгого режиму інструкції with недоступні та, відповідно, не потребують цього символа.

Присвоєння властивості значення true у об'єкті unscopables зробить її невидимою (unscopable), і, таким чином, вона не з'явиться у змінних лексичної області видимості. Присвоєння властивості значення false зробить її видимою (scopable), відповідно, вона з'явиться у змінних лексичної області видимості.

{{js_property_attributes(0,0,0)}}

Приклади

Видимість у інструкціях with

Наступний код добре працює у версіях ES5 та нижче. Однак, у ECMAScript 2015 та пізніших версіях був запроваджений метод {{jsxref("Array.prototype.keys()")}}. Це означає, що всередині оточення with "keys" тепер буде методом, а не змінною. Саме тоді був доданий символ unscopables. Вбудоване налаштування unscopables реалізоване у вигляді {{jsxref("Array.@@unscopables", "Array.prototype[@@unscopables]")}}, щоб запобігти потраплянню деяких методів масиву у область видимості with.

var keys = [];

with (Array.prototype) {
  keys.push('something');
}

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

Unscopables у об'єктах

Ви також можете налаштувати 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('ESDraft', '#sec-symbol.unscopables', 'Symbol.unscopables')}}

Сумісність з веб-переглядачами

{{Compat("javascript.builtins.Symbol.unscopables")}}

Див. також