Eu tenho uma função javascript estática que pode levar 1, 2 ou 3 parâmetros:
function getData(id, parameters, callback) //parameters (associative array) and callback (function) are optional
Sei que sempre posso testar se um determinado parâmetro é indefinido, mas como saber se o que foi passado foi o parâmetro ou o retorno de chamada?
Qual é a melhor maneira de fazer isso?
Exemplos do que pode ser passado em:
1:
getData('offers');
2:
var array = new Array();
array['type']='lalal';
getData('offers',array);
3:
var foo = function (){...}
getData('offers',foo);
4:
getData('offers',array,foo);
javascript
jd.
fonte
fonte
Respostas:
Você pode saber quantos argumentos foram passados para sua função e pode verificar se seu segundo argumento é uma função ou não:
Você também pode usar o objeto de argumentos desta maneira:
Se você estiver interessado, dê uma olhada neste artigo de John Resig, sobre uma técnica para simular a sobrecarga de método no JavaScript.
fonte
Er - isso implicaria que você está invocando sua função com argumentos que não estão na ordem correta ... o que eu não recomendaria.
Em vez disso, eu recomendaria alimentar um objeto para sua função:
Benefícios:
Desvantagens:
Se você não tiver escolha, poderá usar uma função para detectar se um objeto é realmente uma função (veja o último exemplo).
Nota: Esta é a maneira correta de detectar uma função:
fonte
Portanto, use o operador typeof para determinar se o segundo parâmetro é uma matriz ou função.
Isso pode dar algumas sugestões: http://www.planetpdf.com/developer/article.asp?ContentID=testing_for_object_types_in_ja
Não tenho certeza se isso é trabalho ou lição de casa, então não quero lhe dar a resposta no momento, mas o tipo de ajuda a determinar.
fonte
Você deve verificar o tipo de parâmetros recebidos. Talvez você deva usar a
arguments
matriz, já que o segundo parâmetro às vezes pode ser 'parameters' e, às vezes, 'callback', e nomear os parâmetros pode ser enganoso.fonte
Sei que essa é uma pergunta bastante antiga, mas lidei com isso recentemente. Deixe-me saber o que você acha desta solução.
Criei um utilitário que me permite digitar argumentos fortemente e deixá-los opcionais. Você basicamente envolve sua função em um proxy. Se você pular um argumento, ele será indefinido . Pode ficar estranho se você tiver vários argumentos opcionais do mesmo tipo, um ao lado do outro. (Existem opções para passar funções em vez de tipos para fazer verificações personalizadas de argumentos, além de especificar valores padrão para cada parâmetro.)
É assim que a implementação se parece:
Para maior clareza, eis o que está acontecendo:
Você pode ver o código do proxy organizeArgs no meu repositório GitHub aqui:
https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js
Aqui está a função de utilitário com alguns comentários copiados do repositório:
fonte
Eu recomendo que você use o ArgueJS .
Você pode apenas digitar sua função desta maneira:
Eu considerei pelos seus exemplos que você deseja que seu
id
parâmetro seja uma string, certo? Agora,getData
está exigindo umString id
e está aceitando os opcionaisObject parameters
eFunction callback
. Todos os casos de uso que você postou funcionarão conforme o esperado.fonte
Você pode usar a propriedade do objeto argumentos dentro da função
fonte
Você está dizendo que pode ter chamadas como estas: getData (id, parameters); getData (id, retorno de chamada)?
Nesse caso, você obviamente não pode confiar na posição e precisa analisar o tipo: getType () e, se necessário, getTypeName ()
Verifique se o parâmetro em questão é uma matriz ou uma função.
fonte
Eu acho que você deseja usar typeof () aqui:
fonte
Se o seu problema é apenas com sobrecarga de função (você precisa verificar se o parâmetro 'parameters' é 'parameters' e não 'callback'), recomendo que você não se preocupe com o tipo de argumento e
use essa abordagem . A ideia é simples - use objetos literais para combinar seus parâmetros:
fonte
Acho que isso pode ser um exemplo auto-explicativo:
fonte
Você pode substituir a função? Isso não vai funcionar:
fonte