Symbol.unscopables

Symbol.unscopables ウェルノウンシンボルは、自身のプロパティ名と継承されたプロパティ名が、関連付けられたオブジェクトの with 環境バインディングから除外されているオブジェクトの値を指定するために使用されます。

解説

The @@unscopables シンボル (Symbol.unscopables) は、 with 環境バインディングでプロパティ名が語彙的変数として公開されないようにするために、任意のオブジェクトに定義することができます。厳格モードを使用している場合、 with 文は使用できず、このシンボルも必要ないことに注意してください。

unscopables オブジェクトでプロパティを true に設定すると、そのプロパティはスコープ不能になり、語彙的スコープ変数には表示されません。プロパティを false に設定すると、 scopable になり、語彙的スコープ変数に表示されます。

Symbol.unscopables のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能 不可

with 文内のスコープ

次のコードは、ES5 以下であれば正しく動作します。しかし、 ECMAScript 2015(ES6)以降では、Array.prototype.keys() メソッドが導入されました。これは、with 環境内で "keys" はメソッドであり変数ではないことを意味します。これが unscopable シンボルを導入すべき時です。ビルトインの unscopables 設定は、配列のメソッドのいくつかが with 環境のスコープに入らないようにするために、Array.prototype[@@unscopables] として実装されています。

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
}

仕様書

仕様書
ECMAScript (ECMA-262)
Symbol.unscopables の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
unscopablesChrome 完全対応 45Edge 完全対応 12Firefox 完全対応 48IE 未対応 なしOpera 完全対応 32Safari 完全対応 9WebView Android 完全対応 45Chrome Android 完全対応 45Firefox Android 完全対応 48Opera Android 完全対応 32Safari iOS 完全対応 9Samsung Internet Android 完全対応 5.0nodejs 完全対応 0.12

凡例

完全対応  
完全対応
未対応  
未対応

関連情報