Symbol.unscopables
The Symbol.unscopables
well-known symbol is used to specify an object value of whose own and inherited property names are excluded from the with
environment bindings of the associated object.
Value
The well-known symbol @@unscopables
.
Description
The @@unscopables
symbol (accessed via Symbol.unscopables
) can be defined on any object to exclude property names from being exposed as lexical variables in with
environment bindings. Note that when using strict mode, with
statements are not available, and this symbol is likely not needed.
Setting a property of the @@unscopables
object to true
(or any truthy value) will make the corresponding property of the with
scope object unscopable and therefore won't be introduced to the with
body scope. Setting a property to false
(or any falsy value) will make it scopable and thus appear as lexical scope variables.
When deciding whether x
is unscopable, the entire prototype chain of the @@unscopables
property is looked up for a property called x
. This means if you declared @@unscopables
as a plain object, Object.prototype
properties like toString
would become unscopable as well, which may cause backward incompatibility for legacy code assuming those properties are normally scoped (see an example below). You are advised to make your custom @@unscopables
property have null
as its prototype, like Array.prototype[Symbol.unscopables]
does.