Como criar uma aridade variável (com comprimento variável, lista de argumentos) função de wrapper em JavaScript
-
20-09-2019 - |
Pergunta
A intenção é construir um wrapper para proporcionar um método consistente de chamar funções nativas com aridade variável em vários hosts de script - para que o script pode ser executado em um navegador, bem como o Host de Script do Windows ou de outros mecanismos de script.
Estou ciente de 3 métodos de que cada um tem suas próprias desvantagens.
eval()
método:function wrapper () { var str = ''; for (var i=0; i<arguments.lenght; i++) str += (str ?', ':'') + ',arguments['+i+']'; return eval('[native_function] ('+str+')'); }
switch()
método:function wrapper () { switch (arguments.lenght) { case 0: return [native_function] (arguments[0]); break; case 1: return [native_function] (arguments[0], arguments[1]); break; ... case n: return [native_function] (arguments[0], arguments[1], ... arguments[n]); } }
apply()
método:function wrapper () { return [native_function].apply([native_function_namespace], arguments); }
O que há de errado com eles, você pergunta?
Bem, vamos mergulhar em todas as razões pelas quais
eval()
é o mal?E também todos os concatenação de seqüência de caracteres...Não é uma solução para ser rotulado como "elegante".Nunca se pode saber o máximo
n
e, assim como muitoscases
para se preparar.Isso também iria ultrapassar o script de imensas proporções e o pecado contra o santo SECO princípio.O script pode ser executado em navegadores mais antigos (pré - JavaScript 1.3 / ECMA-262-3) motores que não suportam a
apply()
o método.
Agora a parte da pergunta:existe alguma outra solução?
Solução
Apenas use apply()
. E para o seu antiquado Motores de execução, basta fazer isso
if ( 'undefined' == typeof Function.prototype.apply )
{
Function.prototype.apply = function( context, args )
{
// whatever hacky way you want to implement it - i guess eval.
}
}
Outras dicas
Assim como o automático 'este' variável, há um 'argumentos' variável que contém todos os argumentos passados para a função.Ver javascript aridade variável.