Где недопустимые переменные go при использовании JavaScript с оператором () {}? - PullRequest
0 голосов
/ 10 февраля 2020

При использовании JavaScript с оператором, где переменные с недопустимыми именами go?

var o = {"@#$%":1,"test":2}

with(o){
  console.log(test)
  // Can't do this:
  //console.log(@#$%)
  // Was it not imported, or is it just inaccessible?
}

Можете ли вы ссылаться на код в JavaScript движке?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Если свойство не является допустимым идентификатором, на него нельзя ссылаться как на идентификатор внутри 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. Это может вызвать ошибки ... )

0 голосов
/ 10 февраля 2020

Где переменные […] go?

Я думаю, что у вас это задом наперед. Оператор with не создает никаких переменных (как объявление var), вместо этого он изменяет scope , так что любой идентификатор ищется как свойство объекта. Каждый раз, когда вы обращаетесь к xyz, он выглядит if ('xyz' in o) return o.xyz else … - поэтому операторы with настолько медленны и устарели в строгом режиме.

Так что вообще нет "переменных с недопустимыми именами". Если бы вы сначала использовали неверный идентификатор, это вызвало бы синтаксическую ошибку, и код даже не запустился бы.

...