2016-08-26 3 views
0

Поскольку я слышал от многих людей, что использование eval() и новой функции() считается небезопасной функцией из-за ее ультрадинамичной природы. Мне просто нужно преобразовать строку, которая изначально была функцией, назад к функции, чтобы использовать эту функцию и в других кластерах. Это простая тестовая программа, которую я разработал для вашего удобства, это функция eval(), и она работает нормально. Есть ли альтернативный способ, отличный от eval() или даже new Function()?Лучшая альтернатива eval() для преобразования строки обратно в функцию?

$(document).ready(function(){ 

savecallback = function() { 
alert("testing savecallback"); 
} 

var stringname = "function() {alert("testing savecallback");}"; 

jQuery(".divclass").click(function() { 
eval(stringname); 
}); 

}); 

EDIT:

Мне жаль, ребята, на самом деле строка хранит всю реализацию функции вместо имени функции для того, что я осмотрены в моем файле проекта. Отредактирован код выше (в var stringname).

ответ

0

Причина, по которой eval() и новый Funciton() небезопасны, так это то, что они могут производить и/или запускать исполняемый код. Вам нужно создать исполняемый код, поэтому любой способ, который вы найдете, небезопасен.

0

я предполагаю там, наверное, лучше все вокруг решения для того, что вы пытаетесь сделать - больше информации о том, что проблема, которую вы пытаетесь решить может быть полезно :)

от чего вы» ве писал, я бы рассмотреть вопрос об использовании свойства объекта для функции, а затем сохранить имя объекта свойства вместо полной строки выполнения функции:

// 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() или два, которые можно найти даже в этих реализациях.

удачи!

0

Если у вас есть фиксированный список функций, которые вы хотите вызвать (т. Е. Вы знаете все возможные функции заранее), вы можете создать карту функции string-> и найти функцию на основе строкового ключа.

Таким образом, вы можете безопасно позвонить по функциям, не беспокоясь о том, чтобы запустить опасный eval() на входе пользователя.

Например:

$(document).ready(function(){ 

    savecallback = function() { 
     alert("testing savecallback"); 
    } 

    anothercallback = function() { 
     alert("testing anothercallback"); 
    } 

    var availableFunctions = { 
     "savecallback()": savecallback, 
     "anothercallback()": anothercallback 
    }; 

    var stringname = "savecallback()"; 

    jQuery(".divclass").click(function() { 
     if (stringname in availableFunctions) { 
      availableFunctions[stringname].call(); 
     } 
    }); 

}); 
Смежные вопросы