Symbol.unscopables 指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。
{{InteractiveExample("JavaScript Demo: Symbol.unscopables")}}
```js interactive-example const object1 = { property1: 42, };
object1[Symbol.unscopables] = { property1: true, };
with (object1) { console.log(property1); // Expected output: Error: property1 is not defined }
## 描述
可以在任何对象上定义 `[Symbol.unscopables]` 符号(`Symbol.unscopables`),用于排除属性名称并与 `with` 环境绑定在一起作为词法变量公开。请注意,如果使用[严格模式](/zh-CN/docs/Web/JavaScript/Reference/Strict_mode),语句将不可用,并且可能也不需要符号。
在 `unscopables` 对象上设置属性为 true,将使其 _unscopable_ 并且因此该属性也将不会在词法环境变量中出现。如果设置属性为 `false` ,则将使其可 `scopable` 并且该属性会出现在词法环境变量中。
{{js_property_attributes(0,0,0)}}
## 示例
下列的代码可兼容 ES5 及以下版本。然而,在 ECMAScript 2015 (ES6) 或其后续版本中,<code>Array.prototype.keys()</code> 方法才会出现。意味着内部 `with` 环境“关键字”存在该方法,但变量中不会存在。也就是说,当 `unscopable`s symbol 被展示时,内置的`unscopables` 设置是由 [`Array.prototype[Symbol.unscopables]`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.unscopables) 展示并实现的,一些 Array 的方法 将作为 scoped 放入 `with` 语句中。
```js
var keys = [];
with (Array.prototype) {
keys.push("something");
}
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
}