Почему строка, подобная "{opacity: 1.0, width: '132px'}"
, не может быть оценена с использованием eval() как есть?
Поскольку текст происходит там, где заявление или блок, как ожидается, не выражение, и поэтому {
обозначает начало block, а не начало новой object initializer. (А потом opacity:
интерпретируются как label с последующим разделителем операторов [запятая], а затем width:
выглядит как еще один ярлык, который не действует там.)
Собирает в скобках изменяет контекст синтаксического анализа, так что выражение и поэтому {
открывает инициализатор. (Это та же причина, по которой вы видите самопроизвольные анонимные функции, заключенные в круглые скобки, например (function(){ ... })();
, а не только function(){ ... }();
.)
Более технически, причина в том, что грамматика предпочитает правило «Блокировать» по правилу «ExpressionStatement» при анализе [Statement] (http://es5.github.com/#x12) – georg