2013-09-21 4 views

ответ

5

{a:1} имеет два значения в JavaScript

  • литерал объекта (как в x = {a:1})
  • блок код с меткой (как в while(x) {a:1})

Конкретная интерпретация зависит от состояния анализатора, когда он встречает открытие {. В состоянии «statement» {a:1} будет блоком в состоянии «выражение» - литералом. Поскольку синтаксический разбор всегда начинается в состоянии оператора, {a:1} && x будет считаться block && expression, который является синтаксической ошибкой. Напротив, в x && {a:1}, && заставляет анализатор в состояние «выражение», а {a:1} будет буквальным (без ошибок).

Чтобы гарантировать, что {a:1} всегда является литералом, поставьте перед ним оператор или скобу, чтобы сделать его выражением, например. +{a:1}, !!{a:1}, ({a:1}) т.д.

3

Проблема заключается в том, что вторая строка начинается с {, которая принимается как начало блока и не начало литерала объекта. Попробуйте это:

eval("({a:1}) && {b:2} && alert('this should be ok~~');") 

Добавив скобки вокруг первого объекта он не получает интерпретировано как начало блока кода. (Второй объект, {b:2} в порядке, потому что появляется после && так в этот момент интерпретатор не ожидает блок.)

http://jsfiddle.net/q3sZ9/1/

Обратите внимание, что это не потому, что вы используете eval(): если вы поместите содержимое своих строк прямо в свой скрипт, у вас будет такая же проблема.

Смежные вопросы