2012-03-30 3 views
1

Почему строка, подобная "{opacity: 1.0, width: '132px'}", не может быть оценена с использованием eval() как есть?Javascript - eval() `{}` выражение

eval("{opacity: 1.0, width: '132px'}"); 

// invalid label 
// {opacity: 1.0, width: '132px'} 
// ---------------ꜛ 

eval("v = {opacity: 1.0, width: '132px'}"); 

// works! 

ответ

6

Почему строка, подобная "{opacity: 1.0, width: '132px'}", не может быть оценена с использованием eval() как есть?

Поскольку текст происходит там, где заявление или блок, как ожидается, не выражение, и поэтому { обозначает начало block, а не начало новой object initializer. (А потом opacity: интерпретируются как label с последующим разделителем операторов [запятая], а затем width: выглядит как еще один ярлык, который не действует там.)

Собирает в скобках изменяет контекст синтаксического анализа, так что выражение и поэтому { открывает инициализатор. (Это та же причина, по которой вы видите самопроизвольные анонимные функции, заключенные в круглые скобки, например (function(){ ... })();, а не только function(){ ... }();.)

+0

Более технически, причина в том, что грамматика предпочитает правило «Блокировать» по правилу «ExpressionStatement» при анализе [Statement] (http://es5.github.com/#x12) – georg

1

Попробуйте что-то вроде этого:

eval("({opacity: 1.0, width: '132px'})"); 
+0

Правильный ответ. Это происходит потому, что '{...}' является недопустимым выражением javascript, но '(...)' действительно. – ninjagecko

3

Почему строка, как "{непрозрачности: 1,0, ширина: '132px'}" не может быть оценена с помощью Eval(), как это?

Поскольку {opacity: 1.0, width: '132px'} недействителен javascript as-is. Попробуйте поместить этот оператор как есть, и вы получите js-ошибку. С другой стороны, v = {opacity: 1.0, width: '132px'} действителен javascript.

+0

'{opacity: 1.0, width: '132px'}' отлично подходит для javascript. – georg

+0

@ thg435, вы уверены в этом? Следующее генерирует ошибку javascript для меня: http://jsfiddle.net/n4yMx/ –

+0

Это, по-моему, соответствует вашему определению «действительный». – georg

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