Definición de argumentos
Todas las funciones tienen sus propios argumentos objetados para almacenar los parámetros que realmente recibe, sin limitarse a la lista de parámetros definida cuando se declara la función. No es una matriz, pero es similar a una matriz. Tiene las mismas propiedades y métodos de acceso que una matriz. Puede acceder a los valores del parámetro único correspondiente mediante argumentos [n] y tener la longitud del atributo de longitud de matriz. Pero hay algunos métodos que no tienen matrices. Puede convertir argumentos en matrices reales a través de llamadas y luego realizar operaciones de matriz.
var args = array.prototype.slice.call (argumentos);
Matriz de clases
1. Determinar si los argumentos son una matriz
alerta (argumentos instancia de matriz); alerta (argumentos instancia de objeto);
2. Cómo determinar estrictamente que un datos es una instancia de una clase de matriz (matriz)
function isArray (valor) {if (typeof array.isArray === "función") {return array.isArray (valor); } else {return object.prototype.ToString.call (valor) === "[Array de objetos]"; }}3. Convertir argumentos a una matriz
Método 1: Los tipos incorporados se pueden encontrar a través del prototipo. Array.prototype.slice es el mechón de método incorporado para acceder a la matriz. Devuelve una matriz a través del método de corte. Call es un método que llama a un objeto y reemplaza el objeto actual con otro objeto.
var arg = array.prototype.slice.call (argumentos, 0);
Método 2: El rendimiento es peor que el método 1, porque primero crea una matriz y luego procede.
var arg = [] .slice.call (argumentos, 0);
Método 3: Convertir a una matriz a través del bucle
function toArray (argumentos) {var a = []; para (var i = 0; i <arguments.length; i ++) {a.unshift (argumentos. [i]); } return a;}Llamador
Cuando se llama a una función por otra función, la función llamada generará automáticamente un atributo de llamadas, señalando el objeto de función que la llama. Si no se llama a la función, la persona que llama es nula.
función testCaller () {var Caller = testCaller.caller; alerta (Caller);} function acaller () {testCaller ();} acaller ();Lo que aparece es el contenido de la función Acaller.
argumentos.callee
argumentos.callee señala la función de ejecución en sí y devuelve el objeto de función que se está ejecutando, es decir, el cuerpo del objeto de función especificado.
Nota: Argumentos. La longitud es la longitud del parámetro real, argumentos.callee.length es la longitud del parámetro formal, que generalmente se usa para determinar si la longitud del parámetro real es consistente.
Obtenga los parámetros reales de la función a través de argumentos y obtenga los parámetros formales de la función a través de argumentos.
También se usa ampliamente en cierres.
var i = 0; función b (num) {if (num <10) {num ++; i ++; // Si hay parámetros, Callee también debe traer los parámetros; argumentos.callee (num); } else {// salida 2 alerta ("la llamada"+i+"Callee!"); }} b (8); La aplicación de argumentos.callee en cierres proporciona una función de llamadas recursivamente. // Use argumentos. Callee para calcular el factorial de 10, por ejemplo: 1 × 2 × 3 × 4 × 5 × 6 × 7 .... función C (x) {return x> 1? x * argumentos.callee (x - 1): 1} (10); // salida 6 alerta (c (3)); // Salida 3628800 Alert (C (10));Ejemplo: Callee encuentra la suma de 1-N
función fn (n) {if (n == 1) return n; el más return n+arguments.callee (N-1);}Permite que una función anónima se llame a sí misma
ejemplo:
Lista de funciones (type) {var result = "<"+type+"l> <li>"; var args = array.prototype.slice.call (argumentos, 1); resultado += args.Join ("</li> <li>"); resultado+= "</li> </"+type+"l>"; Resultado de retorno;} var listtml = list ("o", "one", "dos"); console.log (listhtml);Ejemplo 2: Pregunta de la entrevista: ¿Cuál es la siguiente consola.log resultado [1,2,3,4]?
función foo (x) {console.log (argumentos); return x;} foo (1,2,3,4); función foo (x) {console.log (argumentos); return x;} (1,2,3,4)Durante la preexplicación, la función fn () {} (1); se procesará por separado y se dividirá en dos funciones, la primera es la función fn () {}, y la segunda es una función anónima: (1). Si el segundo no tiene parámetros, se informará un error, pero la función anterior se incluye en A (), que es correcta.
(function fn () {console.log (argumentos);} (1,2,3,4))); (function foo (x) {console.log (argumentos); return x;}) (1,2,3,4) function foo () {bar.apply (null, argumentos);} function bar (x) {console.log (piloteo);} foo (1,2,2,4);