Soy nuevo en el mundo de Javascript y estoy jugando con la escritura de funciones muy básicas y me topé con el siguiente ejemplo por accidente y no estoy seguro de por qué funciona cuando no estoy pasando un parámetro cuando la función lo exige.
Función de muestra
function myfunction(x) {
alert("This is a sample alert");
}
Ahora, si llamo a la función myfunction();
, se me presenta la alerta. ¿Por qué puedo llamar a la función sin errores o advertencias cuando no he pasado un parámetro?
EDITAR
No esperaba tantas respuestas excelentes y de ninguna manera estoy en condiciones de decir qué respuesta es la mejor, así que puedo pedirle a la gente que sugiera la mejor respuesta y otorgaré la aceptación a esa persona.
javascript
overloading
CacahuetesMono
fuente
fuente
function foo(x){...}
yfunction foo(x,y,z){...}
solo puedes tener una función para cada nombre.function overloading
js, tiene otras formas de burlarse de él.Respuestas:
No pasará nada, lo que significa que no obtendrá un error o una advertencia, ya que pasar los parámetros en javascript es opcional.
Todos los parámetros que no fueron "suministrados" tendrán el
undefined
valor .function foo(x, y, z){ //... } foo(1);
Dentro de la
foo
función ahora:function foo(x, y, z){ x === 1 y === undefined z === undefined }
Incluso puede pasar más argumentos, como:
foo(1,2,3,4,5,7); // Valid!
Puede conocer la cantidad de parámetros suministrados
arguments.length
desde dentro de la función.function foo(x, y, z) { console.log('x value: ' + x); console.log('y value: ' + y); console.log('z value: ' + z); console.log('Arguments length: ' + arguments.length); } console.log('Zero parameters'); foo(); console.log('Four parameters'); foo(1, 2, 3, 4);
Ejemplo de función útil que maneja cualquier cantidad de parámetros:
function max() { var maxValue = arguments[0]; for (var i = 1; i < arguments.length; i++) { if (maxValue < arguments[i]) { maxValue = arguments[i]; } } return maxValue; } alert(max(1, 5, 7, 2, 88, 32, 44));
fuente
function myfunction (a,b){}
y pasé los valores myfunction (1,2,3,4,5), ¿supongo que todavía es válida? ¿Se espera que haya alguna advertencia o error?console.log
, así como los argumentos.length?alert
.return
haberlo ignorado. 2. no obtendrá errores ni advertencias. Vea esta DEMOTodos los argumentos en las funciones de JavaScript son opcionales (lea "escrito libremente").
Puede hacer referencia a los argumentos de una función dentro de la función utilizando las variables de argumento nombradas o el objeto de argumentos. Este objeto contiene una entrada para cada argumento que se pasa a la función, el índice de la primera entrada que comienza en 0. Por ejemplo, si a una función se le pasan tres argumentos, puede consultar el argumento de la siguiente manera:
arguments[0] arguments[1] arguments[2]
fuente
Así es como funciona JavaScript. Los parámetros son opcionales y tendrán el valor que no es realmente un valor "indefinido" en la función si faltan en una llamada de función.
Por "opcional" me refiero simplemente a eso: invocar cualquier función implica una lista arbitrariamente larga de parámetros. No es necesario que exista relación entre el número de parámetros pasados a una función y el número declarado . La mejor manera de pensar en esta declaración, entonces:
function x(a, b, c) { // ... }
es que está declarando una función y vinculando el nombre "a" al primer parámetro, "b" al segundo y "c" al tercero. Sin embargo, de ninguna manera se garantiza que alguno de ellos realmente vinculado a un valor en cualquier invocación de la función más adelante.
De la misma manera, puede definir una función sin ningún parámetro y luego "buscarlos" a través del
arguments
objeto:function noArgs() { var a = arguments[0], b = arguments[1], c = arguments[2]; // ... }
Así que no es lo mismo que la primera función, pero está cerca en la mayoría de las formas que cuentan prácticamente.
El valor "indefinido" en JavaScript es un valor, pero su semántica es algo inusual en los lenguajes. En particular, no es exactamente lo mismo que el
null
valor. Además, "indefinido" en sí mismo no es una palabra clave; ¡Es solo un nombre de variable semi-especial!fuente
optional
"no es realmente un valor"undefined
?undefined
.undefined
.JavaScript no tiene valores predeterminados para los parámetros de función como lo hacen otros lenguajes. Por lo tanto, puede pasar tantos argumentos como desee.
Si no pasa un valor, el parámetro es
undefined
.function myfunction(x) { alert(x); } myfunction(); // alerts undefined myfunction(1); // alerts 1 myfunction(1,2,3); // alerts 1
Si pasa más parámetros de los que hay en la firma, puede usar
arguments
.function myfunction(x) { alert(x); console.log(arguments); } myfunction(1,2,3); // alerts 1, logs [1,2,3]
fuente
undefined
logs
. ¿Dónde lo registra?F12
oCtrl+Shift+J
para acceder a él.También puede proporcionar más argumentos que el mencionado en la función
myFunction(1,2,3,4,5,6,7,'etc');
Puedes usar el
arguments
propiedad que es una matriz para ver los argumentos proporcionados.fuente
Porque no hay ningún error hasta que la función espera poder trabajar con el parámetro que se supone que debe pasar.
Por ejemplo:
function myfunction(x) { return x*2; }
Lanzaría un error; aunque probablemente solo un
NaN
(en este caso) o unvariable is undefined
.fuente
function myfunction(a,b) { var calc = a+b; return;}
y luego invoco la función,document.write(myfunction(1.2));
¿por qué todavía obtengo el valor deundefined
aunque estoy pasando un parámetro?return calc;
oreturn a+b;
(como la última línea, obviamente, y este últimoreturn
en lugar delvar calc
).return a+b;
?return
aquí .Si omite el argumento, su valor será
undefined
. Esto le permite crear parámetros opcionales con bastante facilidad.Otra característica es la capacidad de definir una función sin parámetros y llamarla con argumentos con éxito, haciendo uso del
arguments
objeto. Esto le permite crear fácilmente matrices de argumentos de longitud variable.fuente
En javascript, console.log dentro de una función da undefined como salida para parámetros no pasados, pero fuera de la función da un error no definido, ya que dentro de una función, los navegadores declaran explícitamente la variable. Por ejemplo
console.log(x)
da VM1533: 1 Uncaught ReferenceError: x no está definido mientras que
function test(x) { console.log(x) } test();
da indefinido. Es porque el navegador reescribe la función test () como:
function test(x) { var x; console.log(x) }
Otro ejemplo : -
var x =5 ; function test(x) { console.log(x) } test();
aún no está definido ya que la función se convierte
function test(x) { var x; console.log(x) }
La alerta en el siguiente ejemplo dará undefined: -
var x =5; function test() { alert(x); var x =10; } test();
La función anterior se convertirá en: -
function test() { var x; alert(x); x =10; }
El alcance de la variable javascript dentro de una función es el alcance del nivel de función y no el nivel de bloque. Por ejemplo
function varScope() { for(var i = 0; i < 10; i++){ for(var j = 0; j < 5; j++){} console.log("j is "+j) } console.log("i is "+i); } varScope();
dará salida como:
j is 5 i is 10
Nuevamente, la función se ha convertido en: -
function varScope() { var i; var j; for(i = 0; i < 10; i++){ for(j = 0; j < 5; j++){} console.log("j is "+j) } console.log("i is "+i); }
fuente