Javascript - выражение eval () `{}` - PullRequest
1 голос
/ 30 марта 2012

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

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

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

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

// works!

Ответы [ 3 ]

6 голосов
/ 30 марта 2012

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

Поскольку текст возникает там, где ожидается оператор или блок, а не выражение, ипоэтому { обозначает начало блока , а не начало инициализатора объекта .(И тогда opacity: интерпретируется как метка , за которой следует разделитель операторов [запятая], а затем width: выглядит как другая метка, которая там недопустима.)

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

3 голосов
/ 30 марта 2012

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

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

1 голос
/ 30 марта 2012

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

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