Ir para conteúdo
Omar~

Indentificar função anônima

Recommended Posts

Boas?!

Então, venho aqui a pedir ideias sobre como identificar uma função anônima atribuída quando uma segunda função a declara.

Basicamente tenho 2 funções:

uma é chamada para adicionar o tipo de ação e qual função executar com o evento acionado.

outra obtem o tipo e a função para remover o evento no elemento.

on: function () {
    var $type = arguments[0], $listener = arguments[1];
    if (!$_.isDefined(this[0].eventListener)) {
        this[0].eventListener = [];
    }
    this[0].eventListener.push({
        type: $type,
        listener: $listener
    });
    this[0].addEventListener($type, $listener, false);
},
off: function () {
    var $type = arguments[0], $listener = arguments[1], $i = 0, $eventData = null;
    if ($_.isDefined(this[0].eventListener)) {
        for (; $i < this[0].eventListener.length; $i++) {
            $eventData = this[0].eventListener[$i];
            if ($type == $eventData.type && $listener == $eventData.listener) {
                this[0].removeEventListener($eventData.type, $eventData.listener, false);
            } else if ($type == $eventData.type) {
                this[0].removeEventListener($eventData.type, $eventData.listener, false);
            }
        }
    }
}

Perceba que para registrar e mais tarde saber qual função foi atribuída ao evento para remover eu armazenei os valores em um array.

E para remover apenas identifico se o argumento bate com os dados em algum índice do array.

Até então tudo bem.....

function adicionar() {
    elemento.on('click', minhaFuncao);
}
function remover() {
    elemento.off('click', minhaFuncao);
}

O probema está em funções anônimas quando declaradas dentro de outra função como isso:

function adicionar() {
    elemento.on('click', function () {
        // o que fazer....
    });
}

Então até dar para identificar qual função a declarou, porém não dar para remover com removeEventListener pois essa função não é a ouvinte do elemento.

Obs.: Até poderia apagar a função ou "desaturbir sobre o alvo", no entanto não é viável pois pode haver que mais tarde ou outras condições dependam da função.

 

Até cheguei a solucionar "como quebra-galho":

Ao invés de atribuir a função recebida pelo argumento em "on" eu atribuo uma outra função pré definida, e essa função checa do array, se houver um índice onde o objeto é o mesmo tipo de evento e a função requisitada também existe no array, essa pré definida executa a função original.

Porém não é uma função real, e mais tarde se a pessoa quiser disparar a função digamos um click não pode a chamar seus atributos diretamente (porque seus atrinbutos não são dela e sim da pré definda), terá que chamar a função pré definida, pois é ela realmente a ouvinte.

Tornando alvo inviável para quem tem baixo ou menos intimidade com o javascript

 

Por fim até onde eu sei no javascript não há como manipular funções anônimas, por isso o que eu estou tentando fazer é inventar uma solução para algo que não existe.

 

Nota:

Nesse caso funciona pois não há uma outra função intermediária, mesmo que seja algo sem sentido de de fazer

exemplo.on('click', function (e) {
    // o que fazer....
});
exemplo.off('click', function (e) {
    // o que fazer....
});

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é um problema com função anônima e sim como manipular alguma por outra função...

Enfim, consegui produzir uma solução concreta, daí me esbarrei em que fazer algo a respeito não trás benefício algum.

Além do mais funções anônimas devem ser evitadas, por consumirem muito mais processamento.

Mas a aplicação que estou desenvolvendo tem suporte para tais funções, mas não terá suporte a uma manipulação direta a elas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.