Какая лучшая практика: eval или append script?

Мне нужно выполнить пользовательский фрагмент JavaScript, который я получил от какого-либо вызова AJAX. Я мог бы сделать eval строки, или я мог бы просто добавить ее в script -tag в DOM. Какой метод будет лучше?

var dynamicScript = 'alert(\'Hello world!\');';

Метод 1 - Script:

var x = '<script type="text/javascript">' + dynamicScript  +'</scr' + 'ipt>';
$(document.body).append(x);

Способ 2 - Eval:

eval(dynamicScript);

Какой метод лучше и почему? Или есть ли еще лучшая альтернатива?

Ответы

Ответ 1

Я предпочитаю eval, потому что обычно быстрее, чем создание тега script и добавление его (особенно, если вы хотите создать и вставьте его с помощью jQuery).

Боковое примечание (полезное приложение тега script). Я также использую метод script -tag-insertion: в расширениях Google Chrome инъекция script -tags - единственный способ запускать код в области страницу, потому что объект window изолирован песочницей.

PS. Понятие jQuery.getScript(). Этот метод может быть полезен.

Ответ 2

Если вызов ajax возвращает html с тегами script, вы можете использовать $.load() для импорта script.

http://api.jquery.com/load/

Ответ 3

Добавьте его в DOM. Причины (взяты из http://ajaxpatterns.org/On-Demand_Javascript):

JavaScript будет автоматически оцениваться так же, как JavaScript, связанный в статическом HTML, оценивается при первом обнаружении тега. Вы можете объявить голую функцию или переменную, не добавляя ее в окно.

Вы можете загрузить JavaScript из внешних доменов.

URL указывает на определенный ресурс Javascript. С XMLHttpRequest существует большая гибкость: вы можете, например, отправить несколько фрагментов JavaScript внутри разных узлов XML.

У DOM влияет другое поведение. Даже если поведение является временным, script будет добавлен в DOM, тогда как он исчезнет после того, как обратный вызов XMLHttpRequest eval'd его.

Ответ 4

Ни один из методов действительно не подходит для того, что вы делаете. Ваш вызов AJAX должен возвращать не сериализованные сценарии. Оба метода открывают вас до script инъекции.

eval должен быть запрограммирован любой ценой. Это медленное и опасное, eval is evil