Las palabras anteriores
Los parámetros de las funciones de JavaScript son diferentes de los de las funciones en la mayoría de los otros idiomas. A las funciones no les importa en cuántos parámetros se pasan, ni les importa el tipo de datos de los parámetros pasados, e incluso no pueden pasar los parámetros.
argumentos
La definición de función en JavaScript no especifica el tipo de parámetros de función, y la llamada de función no realiza ningún tipo de verificación de los valores de parámetros aprobados. De hecho, las llamadas a la función JavaScript ni siquiera verifican el número de parámetros formales entrantes.
función add (x) {return x+1;} console.log (add (1)); // 2console.log (add ('1')); // '11'console.log (add ()); // Nanconsole.log (add (1,2)); // 2Parámetros formales del mismo nombre
En el modo no rictamente, un parámetro formal del mismo nombre puede aparecer en la función, y solo se puede acceder al último parámetro formal del nombre que aparece
función add (x, x, x) {return x;} console.log (add (1,2,3)); // 3En modo estricto, se produce un error de sintaxis cuando el mismo nombre está involucrado en el error de sintaxis.
function add (x, x, x) {'use strict'; return x;} console.log (add (1,2,3)); // sintaxError: duplicar el nombre del parámetro no permitido en este contextoNúmero de parámetros
Cuando el número especificado de parámetros formales declarados por la función de referencia real es pequeño, los parámetros formales restantes se establecerán en valores indefinidos
función add (x, y) {console.log (x, y); // 1 indefinido} add (1);Use la lógica u operadores a menudo para establecer un valor predeterminado razonable para parámetros omitidos
función add (x, y) {y = y || 2; console.log (x, y); // 1 2} add (1);[Nota] De hecho, usando Y || 2 no es riguroso, establecer explícitamente valores falsos (indefinidos, nulos, falsos, 0, -0, '', nan) también obtendrá el mismo resultado. Por lo tanto, debe establecerse razonablemente en función del escenario real
Cuando hay muchos argumentos reales, los argumentos reales restantes no se pueden obtener directamente. Debe usar el objeto de argumentos mencionado pronto.
Los parámetros en JavaScript están representados internamente por una matriz. La función siempre recibe esta matriz, y no le importa qué parámetros están contenidos en la matriz. Se puede acceder a esta matriz de parámetros a través del objeto Argumentos en el cuerpo de la función, obteniendo así cada parámetro que se pasa a la función. El objeto de argumentos no es una instancia de matriz, es un objeto de matriz que puede acceder a cada elemento de él usando sintaxis de soporte cuadrado.
función add (x) {console.log (argumentos [0], argumentos [1], argumentos [2]) // 1 2 3Return x+1;} add (1,2,3);El atributo de longitud del objeto Argumentos muestra el número de parámetros reales, y el atributo de longitud de la función muestra el número de parámetros formales
función add (x, y) {console.log (argumentos.length) // 3return x+1;} add (1,2,3); console.log (add.length); // 2Los parámetros formales solo son convenientes, pero no necesarios
función add () {return argumentos [0] + argumentos [1];} console.log (add (1,2)); // 3Parámetros del objeto
Cuando una función contiene más de 3 parámetros formales, es realmente un dolor de cabeza para recordar que se llama el orden correcto de los parámetros reales en la función.
function arrayCopy (/*array*/from,/*index*/form_start,/*array*/a,/*index*/to_start,/*integer*/longitud) {// toDO}Pase los parámetros en forma de pares de nombre/valor, por lo que el orden de los parámetros es irrelevante. Al definir una función, el pasado en parámetros reales se escribe en un objeto separado. Se pasa un objeto cuando se le llama. Los pares de nombre/valor en el objeto son los datos de parámetros reales que realmente son necesarios.
función easyCopy (args) {arrayCopy (args.from, args.form_start || 0, args.to, args.to_start || 0, args.length);} var a = [1,2,3,4], b = []; easyCopy ({form: a, a: b, longitud: 4});sincrónico
Cuando el número de parámetros reales de la forma que participan en la misma forma, el valor del objeto de argumentos y el valor de los parámetros formales correspondientes permanecen sincronizados
prueba de función (num1, num2) {console.log (num1, argumentos [0]); // 1 1argumentos [0] = 2; console.log (num1, argumentos [0]); // 2 2num1 = 10; console.log (num1, argumentos [0]); // 10 10} prueba (1);[Nota] Aunque los parámetros nombrados y el valor del objeto de argumentos correspondientes son el mismo, no son el mismo espacio de nombres. Sus espacios de nombres son independientes, pero los valores son sincrónicos
Sin embargo, en modo estricto, los valores del objeto de argumentos y los valores de los parámetros formales son independientes
prueba de función (num1, num2) {'use strict'; console.log (num1, argumentos [0]); // 1 1argumentos [0] = 2; console.log (num1, argumentos [0]); // 1 2num1 = 10; console.log (num1, argumentos [0]); // 10 2} prueba (1);Cuando los parámetros formales no tienen parámetros reales correspondientes, el valor del objeto Argumentos no corresponde al valor de los parámetros formales
prueba de función (num1, num2) {console.log (num1, argumentos [0]); // indefinido, undefinedNum1 = 10; argumentos [0] = 5; console.log (num1, argumentos [0]); // 10,5} test ();Propiedades internas
【Callee】
El objeto de argumentos tiene una propiedad llamada Callee, que es un puntero a la función que posee el objeto Argumentos.
A continuación se muestra la función factorial clásica
función factorial (num) {if (num <= 1) {return 1;} else {return num* factorial (num-1);}} console.log (factorial (5)); // 120Sin embargo, la ejecución de la función anterior está estrechamente junto con el nombre de la función, y el desacoplamiento de la función puede eliminarse utilizando argumentos.
función factorial (num) {if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} console.log (factorial (5)); // 120Pero en modo estricto, acceder a esta propiedad arrojará un error de typeError
función factorial (num) {'use strict'; if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} // typeError: 'caller', 'callee' y 'propiedades' de '5 se pueden acceder en las funciones de modo estricto o los objetos de argumentos para las llamadas a themconsole.log (real (5);En este momento, se puede usar una expresión de función con nombre
var factorial = function fn (num) {if (num <= 1) {return 1;} else {return num*fn (num-1);}}; console.log (factorial (5)); // 120【llamador】
En realidad hay dos atributos de la persona que llama
【1】 Función Llamador
La propiedad de la persona que llama de la función contiene una referencia a la función que llama a la función actual. Si la función actual se llama en el alcance global, su valor es nulo
function outer () {inner ();} function inner () {console.log (inner.caller); //uter () {inner ();}} outer (); function inner () {console.log (inner.caller); // null} inner ();En modo estricto, acceder a esta propiedad lanzará un error de TipoError
function inner () {'use strict'; // typeError: 'llamado' y 'argumentos' son propiedades de la función restringida y no se puede acceder en este contextconsole.log (inner.caller);} inner ();【2】 Argumentos Caller de objeto
Esta propiedad siempre está indefinida. Esta propiedad se define para distinguir las propiedades de los argumentos de la persona que llama.
función inner (x) {console.log (arguments.caller); // undefined} interner (1);Del mismo modo, en modo estricto, acceder a esta propiedad lanzará un error de typeError
function inner (x) {'use strict'; // typeError: 'llamado' y 'argumentos' son propiedades de la función restringida y no se puede acceder en este contextconsole.log (argumentos.caller);} inner (1);Sobrecarga de funciones
Las funciones de JavaScript no pueden implementar una sobrecarga como en el sentido tradicional. En otros idiomas, se pueden escribir dos definiciones para una función, siempre que las firmas de estas dos definiciones (tipos y cantidades de parámetros aceptados) sean diferentes
La función JavaScript no tiene firma porque sus parámetros están representados por una matriz que contiene 0 o más valores. Sin firmas de función, la sobrecarga real es imposible
// La declaración posterior anula la función de declaración anterior addSomEnumber (num) {return num + 100;} función addSomEnumber (num) {return num + 200;} var resultado = addSomEnumber (100); // 300La sobrecarga de métodos solo se puede simular verificando los tipos y cantidades de parámetros en la función aprobada y haciendo diferentes reacciones.
función doadd () {if (arguments.length == 1) {alert (argumentos [0] + 10);} else if (arguments.length == 2) {alert (argumentos [0] + argumentos [1]);}} doadd (10); // 20Doadd (30,20); // 50Pase de parámetros
Todas las funciones en JavaScript se pasan por valor. Es decir, copiar el valor fuera de la función a los parámetros dentro de la función es el mismo que copiar el valor de una variable a otra
【1】 Valor de tipo básico
Al pasar un valor del tipo primitivo a un parámetro, el valor aprobado se copia a una variable local (un elemento de un objeto de parámetro o argumentos nombrados)
función addten (num) {num += 10; return num;} var count = 20; var result = addten (count); console.log (count); // 20, sin cambio console.log (resultado); // 30【2】 Valor de tipo de referencia
Al pasar un valor de tipo de referencia al parámetro, la dirección de este valor en la memoria se copiará a una variable local, por lo que el cambio de esta variable local se reflejará fuera de la función
function setName (obj) {obj.name = 'test';} var persona = new Object (); setName (persona); console.log (persona.name); // 'test'Cuando los parámetros formales del tipo de referencia se anulan dentro de la función, esta variable se refiere a un objeto local. Este objeto local se destruirá inmediatamente después de ejecutar la función
function setName (obj) {obj.name = 'test'; console.log (persona.name); // 'test'obj = new object (); obj.name =' white '; console.log (persona.name); //' test '} var person = new Object (); setname (persona);Lo anterior es la comprensión en profundidad de los parámetros de la función JavaScript introducidos por el editor para usted (recomendado). Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!