JavaScript - Como faço para chamar uma função a partir de uma seqüência de caracteres de nome e passar uma matriz de objeto?

StackOverflow https://stackoverflow.com/questions/1544769

Pergunta

Eu tenho um controle de usuário que permite que os usuários desde o seu próprio script de nomes que são chamados pelo controle de eventos específicos.

Eu tenho o seguinte código:

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());
}

a mim.get_formatFunction contém o nome de uma função, isto é,"FormatItem".Este exemplo está actualmente a utilizar a função eval, que eu não quero usar...mais este exemplo não funciona de qualquer maneira, mas eu pensei que eu ia mostrar o que eu estou tentando chegar.

No exemplo acima, recebo um valor de erro indefinido como 'item' é uma matriz de seqüência de caracteres e eval tenta convertê-lo em uma seqüência de caracteres longa.

Como posso obter esta funcionalidade ainda passar por 'item' como uma matriz de seqüência de caracteres para o nome da função?

Se passar com o nome de funções é uma má idéia, existem alternativas?

Isto é como o meu controle é declarado:

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

Solução

me[me.get_formatFunction()](item);

Outras dicas

Se a sua intenção é passar todos os argumentos para a função especificada pelo utilizador que são passados para formatItem(), então ao invés de usar:

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

Utilização:

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

A aplicar() o método pode ser chamado em um objeto de função, a fim de chamar essa função usando o "isto" e o argumento de matriz.Veja: http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx para uma explicação da (chamada) e aplicar() funções em javascript.

Em seguida, você vai querer get_formatFunction() para retornar um objeto de função, em vez de apenas o nome da função;ou você pode tentar:

me[me.get_formatFunction()]

...para obter uma função que é definida no 'eu' pelo seu nome.(Observe que, se get_formatFunction() retorna a string 'myFunc', então isso é equivalente para mim.myFunc)

[Editar:alteradas as referências a "este" usar " mim " em vez]

Não tenho certeza de qual é o seu plano geral, mas você pode passar funções em torno de si, em vez de seus nomes:

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

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

Bar(Foo, 1, 2);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top