Como criar uma aridade variável (com comprimento variável, lista de argumentos) função de wrapper em JavaScript

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

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.

  1. eval() método:

    function wrapper () {
        var str = '';
        for (var i=0; i<arguments.lenght; i++)
            str += (str ?', ':'') + ',arguments['+i+']';
        return eval('[native_function] ('+str+')');
        }
    
  2. 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]);
            }
        }
    
  3. apply() método:

    function wrapper () {
        return [native_function].apply([native_function_namespace], arguments);
        }
    

O que há de errado com eles, você pergunta?

  1. 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".

  2. Nunca se pode saber o máximo n e, assim como muitos cases para se preparar.Isso também iria ultrapassar o script de imensas proporções e o pecado contra o santo SECO princípio.

  3. 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top