Есть ли причина, по которой
eval("(function(x){return x*x;})")
не возвращает функцию с IE9?
Есть ли причина, по которой
eval("(function(x){return x*x;})")
не возвращает функцию с IE9?
Это ошибка в парсере JScript. Это не должно происходить в IE9, если вы не находитесь в режиме совместимости или Quirks.
IE8 неправильно интерпретирует выражение функции как объявление функции, в результате чего он ничего не возвращает. Ранее упоминалось в этом вопросе.
Вы можете обойти это, используя один из других типичных способов развязать парсер JScript на том, что представляет собой выражение против утверждения, например:
eval('[function(x){return x*x;}][0]')
eval('0?0:function(x){return x*x;}')
Из-за ошибки парсера IE eval
не может напрямую оценить функцию.
Вместо этого вы должны использовать конструктор Function
:
new Function("x", "return x * x;")
В качестве альтернативы вы можете обернуть выражение eval'd в массив:
eval("[ function(x){return x*x;} ][0]")
IE не возражает против eval
массива или объекта, который содержит функцию.
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;})")
Я только что протестировал его и
eval("(function(x){return x*x;})")
он возвращает функцию в IE9.