Динамически выполнять функцию в JavaScript - PullRequest
0 голосов
/ 14 августа 2010

Я хотел бы вызвать функцию, имя которой у меня есть в переменной.

Например:
Я получаю строку "pageTracker._trackpageview('/url/page1.page'); " динамически и назначаю ее переменной, как показано ниже

var myFunction = pageTracker._trackpageview('/url/page1.page');";

Теперь, когда я отправляю страницу, я хочу выполнить функцию, которая находится в переменной myFunction.

Спасибо всем.

Ответы [ 6 ]

3 голосов
/ 14 августа 2010
function functionFromString(funcDef) {
   try {
      return (new Function("return function() {" + funcDef + "};"))();
   } catch (e) {
      alert(e);
      return (function() {});
   }
}

var myFunction = "pageTracker._trackpageview('/url/page1.page');";

var realFunction = functionFromString(myFunction);
realFunction();

Почему это так?

  1. Просто выполнение eval сразу же запускает функцию.Если в самой вызываемой функции возникают ошибки, мы не можем определить разницу между этой ошибкой и ошибкой в ​​разборе.Таким образом, создавая функцию из текста, мы можем отделить ее при разборе от времени ее выполнения.

  2. Просто использование newFunction = Function (myFunction) не скомпилирует ее, поэтомуэто медленнееТак что использование new Function () для возврата функции (которая, в свою очередь, создает функцию) - наша хитрость.Мы могли бы использовать eval и таким же образом, но мне больше нравится новая функция.

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

1 голос
/ 14 августа 2010

Вы пытаетесь не просто выполнить функцию , имя которой у вас есть , но и сложную строку кода с получателем, именем метода и аргументом буквальной строки.Единственный способ выполнить произвольный фрагмент кода с помощью eval() Но eval() опасно.Если вы не очень осторожны, кто-то может передать злокачественный код в ваш скрипт, который будет выполнен внутри вызова eval().

1 голос
/ 14 августа 2010

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

eval("pageTracker._trackpageview('/url/page1.page');");
0 голосов
/ 14 августа 2010

Но таким образом, вы не можете проверить, является ли параметр правильным URL-адресом, или закодировать его и т. Д. И я избегаю eval как ад по известным причинам.

Я бы предпочел более сложный, но более безопасный способ - если это строка, ее можно проанализировать:

//test dub
pageTracker = {
   _trackpageview: function(path) {alert(path)}
}

var str = "pageTracker._trackpageview('/url/page1.page')";

//get param
var urlpathregex = /\('([a-z0-9\-._~%!$&'()*+,;=:@\/]+)'\)/;
var param = urlpathregex.exec(str)[1];

//do some stuff/validation with param
[...]

//get object and function name
var funcregex = /([a-zA-Z0-9_]+)?\.?([a-zA-Z0-9_]+)(?=\()/;
var match = funcregex.exec(str);
var obj, func;
obj = match[1];
func = match[2];

//invoke
window[obj][func](param);

Это просто пример, а не копирование и вставка готового кода :) Поскольку для начала - если вы динамически получаете "pageTracker._trackpageview ('/ url / page1.page')" в виде строки, здесь есть некоторый запах уже.

0 голосов
/ 14 августа 2010

Решение: Обертывание функции

//define:
var myFunction = function (){pageTracker._trackpageview('/url/page1.page');}

//call:
myFunction();


Полный пример:

<html>
   <head>
      <script type="text/javascript">
         var foo = function (){alert('bar');}
      </script>
   </head>
   <body onload="foo();"> </body>
</html>
0 голосов
/ 14 августа 2010

Вы можете использовать eval в javascript ..

var myFunction = "pageTracker._trackpageview('/url/page1.page');";
//...
eval(myFunction);
...