Eu tentei o seguinte sem sucesso:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
Na função a, posso usar a palavra-chave argumentos para acessar uma matriz de argumentos, na função b estes são perdidos. Existe uma maneira de passar argumentos para outra função javascript como eu tento fazer?
javascript
Anders Nygaard
fonte
fonte
arguments
não é uma matriz (mas um objeto que implementa a semântica semelhante a uma matriz ) e, portanto, não está totalmente claro à primeira vista se ela pode ser usada da mesma maneira que uma matriz real.Respostas:
Use
.apply()
para ter o mesmo acesso àarguments
função inb
, assim:Você pode testá-lo aqui .
fonte
var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
apply
como isso pode estragar o escopo deb
(se é alguma função interna de um objeto, por exemplo)Operador de propagação
O ECMAScript ES6 adicionou um novo operador que permite fazer isso de uma maneira mais prática: ... Operador de propagação .
Exemplo sem usar o
apply
método:Note Esse trecho retorna um erro de sintaxe se o seu navegador ainda usa o ES5.
Nota do Editor: Uma vez que os usos do snippet
console.log()
, você deve abrir JS consola do seu navegador para ver o resultado - não haverá nenhum resultado na página.Ele exibirá este resultado:
Em resumo, o operador de dispersão pode ser usado para diferentes propósitos se você estiver usando matrizes; portanto, também pode ser usado para argumentos de função. Você pode ver um exemplo semelhante explicado nos documentos oficiais: Parâmetros de descanso
fonte
...args
daa
função. Você pode apenas fazer uma função sem argumentos e passá-los parab
com...arguments
...args
comoa
entrada pode ser importante se você tiver funções aninhadas.A explicação que nenhuma das outras respostas fornece é que os argumentos originais ainda estão disponíveis, mas não na posição original no
arguments
objeto.O
arguments
objeto contém um elemento para cada parâmetro real fornecido para a função. Quando você liga paraa
você fornecer três argumentos: os números1
,2
e,3
. Então,arguments
contém[1, 2, 3]
.Quando você chama
b
, no entanto, passa exatamente um argumento:a
oarguments
objeto de. Entãoarguments
contém[[1, 2, 3]]
(ou seja, um elemento, que éa
oarguments
objeto de s , que possui propriedades que contêm os argumentos originais paraa
).Como o @Nick demonstrou, você pode usar
apply
para fornecer umarguments
objeto definido na chamada.O seguinte alcança o mesmo resultado:
Mas
apply
é a solução correta no caso geral.fonte
this
paraapply
?tente isso
fonte