Para comemorar que não escrevi um blog há 10 anos, a primeira postagem do blog começará com um truque tão interessante -___-
No ES5, quando chamamos uma função, se os parâmetros a serem passados forem gerados com base em outras funções ou condições, ou seja, quando não tivermos certeza de quantos parâmetros serão passados, o que devemos fazer sem alterar a função original?
(Obviamente, tente evitar a situação descrita neste artigo, como alterar o parâmetro para objeto ou matriz etc.)
A maioria das pessoas pode saber que o uso do aplicativo pode resolver esse problema perfeitamente:
Como a chamada, aplique o primeiro parâmetro será usado como o objeto de chamada da função, ou seja, o ponteiro disso na função de chamada é reescrito como o primeiro parâmetro. Se não for o método do objeto, você pode ignorar isso e passar um nulo.
A diferença é que os seguintes parâmetros, apliquem todos os parâmetros a serem transmitidos para a função de chamada em uma matriz e a chamada é anexada em sequência como a função original.
Como é uma matriz, é controlável. A geração de uma matriz com base em outras funções ou julgamentos lógicos pode alcançar o objetivo de passar em parâmetros de números dinâmicos.
Mas encontrei uma dor de cabeça. Eu tive que passar em parâmetros dinâmicos ao criar um objeto com o novo. Levei apenas uma vez a cada poucos anos:
Se você estiver usando o ES6, com o parâmetro restante, nenhum dos problemas acima é problemático. Observe que a adição de três pontos antes da matriz Args não é um erro de sintaxe, mas um método de escrita de parâmetros de descanso fornecido pelo ES6. Você pode entendê -lo como substituindo ... Args por Args Array com personagens após colchetes.
Mas é realmente impossível implementar no ES5? Afinal, a maioria das ES6 é açúcar sintático e você pode usar ferramentas como Babel para compilar com ES5. Com perguntas, vamos usar Babel para compilar e ver o que recebemos:
Fiquei chocado quando vi a última linha. Não tenha medo. Vamos analisar este código. Primeiro, vamos desmembrá -lo e olhar em três etapas:
1. Não há dúvida de que o uso de concat para concatenar nulo com nossos parâmetros em uma matriz, conforme o segundo parâmetro aplicado, ou seja, obtemos [NULL, 1, 2, 3];
2. Vamos calcular. O primeiro parâmetro foo substituirá a função para chamar o método de ligação nativo. O conteúdo da segunda matriz de parâmetros será passado como um parâmetro de ligação, ou seja, foo.bind (null, 1, 2, 3);
3. O primeiro parâmetro do método de ligação é semelhante à aplicação e chamada, modifique esse ponteiro e os parâmetros subsequentes podem implantar o valor de argumento principal predefinido padrão para a função. Ou seja, quando a ligação é executada, obtemos uma classe Foo com três valores de parâmetros injetados no primeiro conjunto de colchetes, que é chamado de foowithargs por enquanto;
Finalmente, quando novos foowithargs (); , não precisamos passar em nenhum parâmetros. Equivalente a novos foo (1, 2, 3);