Как в javascript вызвать функцию по имени с передачей параметров?

pitrik2

javascript 1.6
трудно объяснить что я хочу
привожу схематический пример

function execute(fname) {
var args = execute.arguments;

args.removefirst; // remove fname

eval(fname + '(' + args + ')';
}

вызываться тогда будет так: execute('foo', 1, '2', new Array
проблема в том, что я не могу функцию foo поменять
иначе бы я в ней на вход получал 1 параметр - массив, а не много параметров
нашел вот такую штуку:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Ref...
но не могу сообразить как это можно применить в моем случае

pilot

eval('alert''hello world!');

Поможет?

artimon

Если функция явно не является чьим-то методом, то она метод глобального объекта window.
Соответственно window[fname].apply(null,args)

pitrik2

Поможет?
йоу
родилась идея
вызвать eval от eval
тогда должно сработать
ща напишу

pitrik2

написал:

function execute(fname) {
var str = 'eval(fname';
for(var i = 1; i < arguments.length; i++) {
str = str + 'arguments[' + i + ']';
if(i < arguments.length - 1) {
str = str + ',';
}
}
str = str + ')';
return eval(str);
}

тут же сообразил что я идиот и смысла в двух эвалах нету:

function execute1(fname) {
var str = fname + '(';
for(var i = 1; i < arguments.length; i++) {
str = str + 'arguments[' + i + ']';
if(i < arguments.length - 1) {
str = str + ',';
}
}
str = str + ')';
return eval(str);
}

тест прошел на ура

function bar(a, c) {
return a + c[1];
}

function test {
var d = 10;
var e = new Array(5,6,7);

alert(execute('bar', d, e;
alert(execute1('bar', d, e;
}

фактически я сам ответил на свой вопрос
но за eval(fargs) все равно спасибо, буду знать

pitrik2

Если функция явно не является чьим-то методом, то она метод глобального объекта window.Соответственно window[fname].apply(null,args)
БОЛЬШОЕ СПАСИБО !
самый красивый вариант:

function execute2(fname) {
var args = new Array;
for(var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
return window[fname].apply(null, args);
}

интересно нельзя ли пропертисы аргументов без цикла в аррей преобразовать?

artimon

Одного я не понимаю, нафига передавать имя функции в виде строки? Почему нельзя передать саму функцию?

pitrik2

и что мне это даст?

artimon

Вместо window[fname] можно написать fname.
Можно использовать анонимные функции.
execute(function(a,b){return a + b}, 10, 20);

Хотя я вообще плохо понимаю назначение такой функции.

pitrik2

клева
только боюсь что саму функцию я не смогу передавать
дело в том что я юзаю rhino, я из java вызываю эту свою execute
анонимную я точно не смогу так передать, а вот по имени вроде можно, но мне тогда нужно будет из контекста вытаскивать объект Function
а тогда нарушиться общая структура кода, тоесть получится:
если вызывается функция execute, то по первому аргументу вытащить Function и передать его в качестве первого аргумента
эдакий воркэраунд
кстати
столкнулся с еще одной траблой
объект window отсутствует в rhino
т.е. execute2 даже не компилится...

pitrik2

ура!
я сделал!
даже с анонимными работает
надо было просто eval(fname) сделать чтобы саму функцию получить

function execute2(fname) {
var args = new Array;
for(var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
return eval(fname).apply(null, args);
}

> тебе еще раз спасибо!
Оставить комментарий
Имя или ник:
Комментарий: