この記事は編集レビューを必要としています。ぜひご協力ください。
Symbol.unscopables
ウェルノウンシンボルは、関連するオブジェクトの with
環境バインディングから除外される自身および継承したプロパティ名のオブジェクト値を指定するために使用されます。
Symbol.unscopables のプロパテイ属性 |
|
---|---|
書込可能 | 不可 |
列挙可能 | 不可 |
設定可能 | 不可 |
説明
@@unscopables
シンボル(Symbol.unscopables
)は、with
環境バインディングでレキシカル変数として公開されているプロパティ名を除外するために、任意のオブジェクトで定義できます。Strict モードを使用している場合、with
ステートメントは使用不可のため、このシンボルを使う必要がありません。
unscopables
オブジェクトでプロパティを true
に設定すると、unscopable になります。それゆえ、レキシカルスコープ変数に現れません。プロパティを false
に指定すると scopable
になりレキシカルスコープ変数に現れます。
例
次のコードは、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
を設定することもできます。
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 2015 (6th Edition, ECMA-262) Symbol.unscopables の定義 |
標準 | 初期定義。 |
ECMAScript 2017 Draft (ECMA-262) Symbol.unscopables の定義 |
ドラフト |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | 未サポート | 48 (48) | 未サポート | 未サポート | 未サポート |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | 未サポート | 未サポート | 48.0 (48) | 未サポート | 未サポート | 未サポート |
関連項目
Array.prototype[@@unscopables]
with
ステートメント(Strict モードでは使用不可)