Проблемы с IE9 JavaScript eval () - PullRequest
12 голосов
/ 24 июля 2011

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

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

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

Ответы [ 4 ]

9 голосов
/ 24 июля 2011

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

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

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

eval('[function(x){return x*x;}][0]')
eval('0?0:function(x){return x*x;}')
5 голосов
/ 24 июля 2011

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

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

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

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

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

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

2 голосов
/ 24 июля 2011
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;})")
1 голос
/ 24 июля 2011

Я только что проверил это и

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

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

...