Если свойство не является допустимым идентификатором, на него нельзя ссылаться как на идентификатор внутри with
. Это не недоступно, но единственный вариант - вручную просмотреть свойство исходного объекта, как обычно:
var o = {"@#$%":1,"test":2}
with(o){
console.log(o['@#$%']);
}
Этот тип проблемы не является исключительным для устаревшего оператора with
. Это происходит и с глобальным объектом. Точно так же, как оператор with
создает объектную запись среды , аналогично, весь код в сценарии, в некотором смысле, неявно заключен в with
для глобального объекта (что приводит к глобальной записи среды ).
По тем же причинам, когда свойство, которое не может быть идентификатором, находится на window
, например:
window['###'] = 'foo';
Невозможно добраться до foo
с помощью автономного идентификатора без явной ссылки на window
сначала (или использовать какой-либо другой метод для доступа к глобальному объекту).
(разумеется, как и в случае with
, свойства, которые являются действительными в качестве идентификаторов на window
, могут ссылаться автономно - поэтому мы можем, например, ссылаться на undefined
и Array
вместо window.undefined
и window.Array
. Это может вызвать ошибки ... )