--- title: Symbol.unscopables slug: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables tags: - ECMAScript 2015 - JavaScript - Property - Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables ---
Symbol.unscopables
ウェルノウンシンボルは、自身のプロパティ名と継承されたプロパティ名が、関連付けられたオブジェクトの with
環境バインディングから除外されているオブジェクトの値を指定するために使用されます。
The @@unscopables
シンボル (Symbol.unscopables
) は、 with
環境バインディングでプロパティ名が語彙的変数として公開されないようにするために、任意のオブジェクトに定義することができます。厳格モードを使用している場合、 with
文は使用できず、このシンボルも必要ないことに注意してください。
unscopables
オブジェクトでプロパティを true
に設定すると、そのプロパティはスコープ不能になり、語彙的スコープ変数には表示されません。プロパティを false
に設定すると、 scopable
になり、語彙的スコープ変数に表示されます。
{{js_property_attributes(0,0,0)}}
次のコードは、ES5 以下であれば正しく動作します。しかし、 ECMAScript 2015(ES6)以降では、{{jsxref("Array.prototype.keys()")}} メソッドが導入されました。これは、with
環境内で "keys" はメソッドであり変数ではないことを意味します。これが unscopable
シンボルを導入すべき時です。ビルトインの unscopables
設定は、配列のメソッドのいくつかが with
環境のスコープに入らないようにするために、{{jsxref("Array.@@unscopables", "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 }
仕様書 |
---|
{{SpecName('ESDraft', '#sec-symbol.unscopables', 'Symbol.unscopables')}} |
{{Compat("javascript.builtins.Symbol.unscopables")}}