Подтвердить что ты не робот

Проблемы с IE9 javascript eval()

Есть ли причина, по которой

eval("(function(x){return x*x;})")

не возвращает функцию с IE9?

4b9b3361

Ответ 1

Это ошибка в парсере JScript. Это не должно происходить в IE9, если вы не находитесь в режиме совместимости или Quirks.

IE8 неправильно интерпретирует выражение функции как объявление функции, в результате чего он ничего не возвращает. Ранее упоминалось в этом вопросе.

Вы можете обойти это, используя один из других типичных способов развязать парсер JScript на том, что представляет собой выражение против утверждения, например:

eval('[function(x){return x*x;}][0]')
eval('0?0:function(x){return x*x;}')

Ответ 2

Из-за ошибки парсера IE eval не может напрямую оценить функцию.

Вместо этого вы должны использовать конструктор Function:

new Function("x", "return x * x;")

В качестве альтернативы вы можете обернуть выражение eval'd в массив:

eval("[ function(x){return x*x;} ][0]")

IE не возражает против eval массива или объекта, который содержит функцию.

Ответ 3

eval("(function(x){return x*x;})")

... отлично работает в IE9 в обычном режиме (live proof) (но см. ниже). Это не значит, что это хорошая идея (очень, очень мало использования eval квалифицируются как что-то другое, чем следует избегать), но он действительно работает.

Он также работает (и должен работать) в последних версиях Chrome, Firefox и Opera.

В IE6, IE7, IE8 или IE9 он не работает в "представлении совместимости". Это будет ошибкой (по-видимому, такой, который фиксируется вместе с тысячей других с новым движком JavaScript в IE9), нет ничего плохого в этом выражении.

Вы можете исправить это в более ранних версиях, заставив парсер реализовать это выражение (живая копия):

eval("(0 || function(x){return x*x;})")

Ответ 4

Я только что протестировал его и

eval("(function(x){return x*x;})")

он возвращает функцию в IE9.