Cada função JavaScript pode acessar uma variável especial - argumentos dentro de seu escopo. Essa variável contém uma lista de todos os parâmetros passados para a função.
O objeto de argumentos não é uma matriz. Embora sintaticamente tenha o mesmo local que uma matriz, por exemplo, possui a propriedade Length. Mas não é herdado do Array.prototype, de fato, é um objeto.
Portanto, não podemos usar diretamente alguns métodos de matriz para argumentos, como push, pop ou fatia, etc. Portanto, para usar esses métodos, precisamos convertê -lo em uma matriz real.
Converter em uma matriz
O código a seguir retornará uma matriz contendo todos os elementos do objeto Argumentos.
Array.prototype.slice.call (argumentos);
Como a velocidade de conversão é muito lenta, isso não é recomendado em programas com requisitos rígidos de desempenho.
Passe os parâmetros
Aqui está um método mais recomendado para passar o objeto de argumentos de uma função para outra.
A cópia do código é a seguinte:
function foo () {
bar.Apply (nulo, argumentos);
}
barra de função (a, b, c) {
// Faça coisas aqui
}
Existe outro método inteligente, que é criar rapidamente um método externo desbotado usando a chamada e aplicar ao mesmo tempo.
A cópia do código é a seguinte:
function foo () {}
Foo.prototype.method = function (a, b, c) {
console.log (isto, a, b, c);
};
// Crie uma versão não ligada de "Method"
// leva os parâmetros: este, arg1, arg2 ... argn
Foo.method = function () {
// resultado: foo.prototype.method.call (this, arg1, arg2 ... argn)
Function.Call.Apply (foo.prototype.method, argumentos);
};
A relação entre parâmetros de função e atributos de argumentos
O objeto de argumentos cria métodos getter e setter para suas próprias propriedades e parâmetros de função.
Portanto, a modificação dos parâmetros formais da função afetará os valores da propriedade do objeto de argumentos correspondentes e vice -versa.
A cópia do código é a seguinte:
função foo (a, b, c) {
argumentos [0] = 2;
um; // 2
b = 4;
argumentos [1]; // 4
var d = c;
d = 9;
c; // 3
}
foo (1, 2, 3);
Questões de desempenho
Os argumentos não serão criados em apenas dois casos, um é declarado como uma variável local dentro da função e o outro é usado como um parâmetro formal da função. Em outros casos, o objeto de argumentos sempre será criado.
Como os métodos Getter e Setter são sempre criados com a criação de objetos de argumentos, o uso de argumentos tem pouco efeito no próprio desempenho.
No entanto, existe uma situação que afeta seriamente o desempenho de JavaScript, que deve usar argumentos.callee.
A cópia do código é a seguinte:
function foo () {
argumentos.callee; // Faça algo com este objeto de função
argumentos.callee.caller; // e o objeto de função de chamada
}
função bigloop () {
for (var i = 0; i <100000; i ++) {
foo (); // normalmente seria inlinado ...
}
}
No código acima, a função Foo não é mais uma extensão em linha simples, porque precisa se conhecer e seu chamador. Isso não apenas compensa as melhorias de desempenho trazidas por extensões em linha, mas também prejudica o encapsulamento da função, porque a própria função pode precisar confiar em um fundo de chamada específico.
Portanto, é recomendável que você tente não usar argumentos.callee.
O exposto acima é tudo sobre o objeto Javascript Argumments. Você sabe isso completamente? Simplesmente coloque
Argumentos referem -se ao objeto de parâmetro da função (refere -se aos parâmetros passados reais)
argumentos.Length refere -se ao comprimento do objeto de parâmetro da função.
Argumentos [i] refere-se ao valor do parâmetro i-és (o primeiro é 0)