$f = (float) "1.8281e-009";
var_dump($f); // float(1.8281E-9)
Я бы избегал eval.
Чтобы решить эту проблему, вы должны знать следующее о JavaScript.
[]
точки , или наоборот. Ваша проблема возникла в результате рассмотрения точечный метод ссылки, а не метод квадратных скобок.
Итак, почему бы не что-то вроде,
window["functionName"]();
Это ' s при условии, что ваша функция живет в глобальном пространстве. Если вы используете пространство имен, то:
myNameSpace["functionName"]();
Избегайте eval и избегайте передачи строки в setTimeout и setInterval. Я пишу много JS, и мне НИКОГДА не нужен eval. "Необходимость" в eval возникает из-за недостаточного знания языка. Вам нужно узнать об области видимости, контексте и синтаксисе. Если вы когда-нибудь застряли с оценкой, просто спросите - вы быстро научитесь.
Если он находится в глобальной области видимости, лучше использовать:
function foo()
{
alert('foo');
}
var a = 'foo';
window[a]();
, чем eval ()
. Потому что eval ()
- это evaaaaaal .
Точно так, как сказал Носредна за 40 секунд до меня, то есть>. <
Это некрасиво, но это первое, что пришло мне в голову. Это также должно позволить вам передавать аргументы:
eval('var myfunc = ' + variable); myfunc(args, ...);
Если вам не нужно передавать аргументы, это может быть проще.
eval(variable + '();');
Применяется стандартное предупреждение сухого кода.
Определенно избегайте использования eval
для подобных действий, иначе вы откроетесь для уязвимостей XSS (межсайтовый скриптинг).
Например, если бы вы были чтобы использовать предлагаемые здесь решения eval
, гнусный пользователь мог отправить своей жертве ссылку, которая выглядела бы так:
http://yoursite.com/foo.html?func=function () {alert ('Im% 20In% 20Teh% 20Codez');}
И их javascript, а не ваш, будет выполнен. Конечно, этот код может сделать что-то гораздо худшее, чем просто всплывающее уведомление; он может украсть куки, посылать запросы в ваше приложение и т. д.
Итак, убедитесь, что вы никогда не проверяете
ненадежный код, который поступает из пользовательского ввода (и что-либо из идентификатора строки запроса считается пользовательским вводом). Вы можете использовать ввод пользователя в качестве ключа, который будет указывать на вашу функцию, но убедитесь, что вы ничего не выполняете, если указанная строка не соответствует ключу в вашем объекте. Например:
// set up the possible functions:
var myFuncs = {
func1: function () { alert('Function 1'); },
func2: function () { alert('Function 2'); },
func3: function () { alert('Function 3'); },
func4: function () { alert('Function 4'); },
func5: function () { alert('Function 5'); }
};
// execute the one specified in the 'funcToRun' variable:
myFuncs[funcToRun]();
Это не удастся, если переменная funcToRun
не указывает ни на что в объекте myFuncs
, но не будет выполнять никакого кода.