MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

Symbol.unscopables

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) 未サポート 未サポート 未サポート

関連項目

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama
 最終更新者: YuichiNukiyama,