я предполагаю там, наверное, лучше все вокруг решения для того, что вы пытаетесь сделать - больше информации о том, что проблема, которую вы пытаетесь решить может быть полезно :)
от чего вы» ве писал, я бы рассмотреть вопрос об использовании свойства объекта для функции, а затем сохранить имя объекта свойства вместо полной строки выполнения функции:
// object to store callbacks on
var callbacks = {};
// define your callback
callbacks['savecallback'] = function() {
alert('testing savecallback');
}
// save your callback name
var stringname = 'savecallback';
jQuery(".divclass").click(function() {
// call your callback by name
callbacks[stringname]();
});
если есть некоторые или все из этого кода вы не можете контролировать (определение обратного вызова или сохраненная строка), сообщите нам об этом - есть способы обойти это. если обратный вызов определен в области окна, вы можете window[stringname]();
, и если вы не можете изменить строку обратного вызова, вы можете stringname = stringname.replace('()','');
. в любом случае, если вы можете использовать строку для определения функции для запуска вместо фактического eval
, это было бы лучше.
EDIT: Если вся реализация функции - это строка, вы в значительной степени застряли с eval
. вы могли бы попробовать вставить строку в dom в тег скрипта, но это было бы так же опасно, как eval, если оно даже работает (непроверено). почти в любое время, когда у вас есть код, который вы хотите выполнить, который находится в строчном формате, вы рискуете выполнить какой-либо старый контент в этой строке. до тех пор, пока вы осведомлены о рисках, Eval не конец света, - попытаться сохранить его как закрытые, как это возможно, например:
function getEvalClosure(evalCode) {
return function() { return eval(evalCode); }
}
jQuery(".divclass").click(function() {
var f = (getEvalClosure(stringname))();
// i noticed your code is itself a function,
// so you'd have to run it after eval-ing it into existence
f();
});
он никогда не будет «безопасным» , но помните, что конечные пользователи могут обезьяны с любой частью вашего javascript в любом случае, поэтому я бы не рекомендовал делать что-то слишком чувствительное исключительно в javascript клиента в первую очередь. в этом случае функция getEvalClosure создает новую область для работы eval, сохраняя ее на один шаг дальше от остальной части вашего кода. Я часто использовал eval в преобразовании сжатого JSON из запросов AJAX до того, как каждая библиотека сделала это автоматически - на самом деле, я уверен, что еще есть eval() или два, которые можно найти даже в этих реализациях.
удачи!