Symbol.unscopables

Symbol.unscopables 指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。

描述

可以在任何对象上定义 @@unscopables symbol (Symbol.unscopables),用于排除属性名称并与 with 环境绑定在一起作为词法变量公开。 请注意,如果使用 Strict mode,语句将不可用,并且可能也不需要 symbol。

在 unscopables 对象上设置属性为 true,将使其 unscopable 并且因此该属性也将不会在词法环境变量中出现。 如果设置属性为 false ,则将使其可 scopable 并且该属性会出现在词法环境变量中。

Symbol.unscopables 属性的属性特性:
writable false
enumerable false
configurable false

示例

下列的代码可兼容 ES5 及以下版本。然而,在 ECMAScript 2015 (ES6) 或其后续版本中,Array.prototype[@@unscopables] 展示并实现的, 一些 Array 的方法 将作为 scoped 放入 with 语句中。

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
}

规范

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Symbol.unscopables
Standard 首次定义
ECMAScript Latest Draft (ECMA-262)
Symbol.unscopables
Draft

浏览器兼容性

Update compatibility data on GitHub
Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js
unscopables Chrome Full support 45 Edge Full support 12 Firefox Full support 48 IE No support No Opera Full support Yes Safari Full support 9 WebView Android Full support 45 Chrome Android Full support 45 Firefox Android Full support 48 Opera Android Full support Yes Safari iOS Full support 9 Samsung Internet Android Full support 5.0 nodejs Full support 0.12

Legend

Full support  
Full support
No support  
No support

相关链接