JavaScript - Как мне вызвать функцию из имени строки и передать объект массива? - PullRequest
1 голос
/ 09 октября 2009

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

У меня есть следующий код:

initialize : function()
{

    // Call the base initialize method
    Point74.WebAutoComplete.callBaseMethod(this, 'initialize');

    $(document).ready(
        Function.createDelegate(this, this._onDocumentReady)
    );

},

_onDocumentReady : function()
{
    var me = this;
    $("#" + me.get_id()).autocomplete(me.get_ashxAddress(), 
        { 
            formatItem: function(item)
            {
                return eval(me.get_formatFunction() + "(" + item + ");");
            }
        } 
    ).result(me.get_selectFunction());
}

me.get_formatFunction содержит имя функции, то есть «FormatItem». Этот пример в настоящее время использует eval, который я не хочу использовать ... плюс этот пример все равно не работает, но я подумал, что покажу, что я пытаюсь получить.

В приведенном выше примере я получаю значение undefined error, поскольку 'item' - это строковый массив, и eval пытается преобразовать его в одну длинную строку.

Как я могу достичь этой функциональности, если она все еще проходит через 'item' в виде массива строк с именованной функцией?

Если передача именованных функций - плохая идея, есть ли альтернативы?

Вот как объявлен мой контроль:

<p74:WebAutoComplete runat="server" ID="ato_Test" AshxAddress="WebServices/SearchService.ashx" 
     FormatFunction="formatItem" SelectFunction="searchSelectedMaster" />

Ответы [ 3 ]

3 голосов
/ 09 октября 2009
me[me.get_formatFunction()](item);
1 голос
/ 09 октября 2009

Если вы намереваетесь передать все аргументы указанной пользователем функции, которые передаются в formatItem (), тогда вместо использования:

formatItem: function(item)
{
 return eval(me.get_formatFunction() + "(" + item + ");");
}

Использование:

formatItem: function()
{
 return me.get_formatFunction().apply(me, arguments));
}

Метод apply () может быть вызван для объекта функции, чтобы вызвать эту функцию, используя указанный массив this и аргумент. См. http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx для объяснения функций call () и apply () в javascript.

Тогда вам нужно, чтобы get_formatFunction () возвращала объект функции, а не просто имя функции; или вы можете попробовать:

me[me.get_formatFunction()]

... чтобы получить функцию, которая определена в 'me' по ее имени. (Обратите внимание, что если get_formatFunction () возвращает строку «myFunc», то это эквивалентно me.myFunc)

[Редактировать: изменил ссылки на «это» для использования «я» вместо]

1 голос
/ 09 октября 2009

Я не уверен, каков ваш общий план, но вы можете передавать функции вокруг себя вместо их имен:

function Foo(x, y) {
  // do something
}

function Bar(f, a, b) {
  // call Foo(a,b)
  f(a,b);
}

Bar(Foo, 1, 2);
...