Symbol.unscopables

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

Опис

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

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

Атрибути поля Symbol.unscopables
Доступний для запису ні
Доступний для переліку ні
Доступний для налаштування ні

Приклади

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

Наступний код добре працює у версіях ES5 та нижче. Однак, у ECMAScript 2015 та пізніших версіях був запроваджений метод Array.prototype.keys(). Це означає, що всередині оточення with "keys" тепер буде методом, а не змінною. Саме тоді був доданий символ unscopables. Вбудоване налаштування 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
}

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

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

BCD tables only load in the browser

Див. також