¿Qué sucede si no paso un parámetro en una función de Javascript?

88

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.

CacahuetesMono
fuente
2
También podría ser útil: developer.mozilla.org/en/JavaScript/Guide/Functions
Felix Kling
1
No hay sobrecarga basada en firmas de funciones en JS, por lo que realmente no le importa cuántos parámetros "espera" la función. Incluso puede pasar parámetros que la función no está definida para tomar y simplemente usar los argumentos de palabras clave para recuperarlos.
scrappedcola
@scrappedcola - ¿Qué quieres decir con sobrecargar y pasar parámetros que la función no está definida para tomar? ¿Puede dar ejemplos?
PeanutsMonkey
2
@PeanutsMonkey. Quería decir, no puedes tener dos funciones: function foo(x){...}y function foo(x,y,z){...}solo puedes tener una función para cada nombre.
gdoron apoya a Monica el
2
@PeanutsMonkey. Sí, no puede tener function overloadingjs, tiene otras formas de burlarse de él.
gdoron apoya a Monica el

Respuestas:

111

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 undefinedvalor .

function foo(x, y, z){
    //...
}

foo(1);

Dentro de la foofunció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.lengthdesde 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));

gdoron está apoyando a Monica
fuente
Gracias por la demostración en vivo. No esperaba tantas buenas respuestas. Entonces, si tengo una función como 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?
PeanutsMonkey
Lo siento, ¿le importaría explicar qué hace el comando console.log, así como los argumentos.length?
PeanutsMonkey
@PeanutsMonkey. ¡Válido! sin advertencias sin error, incluso será útil, te daré una demostración en un momento.
gdoron apoya a Monica el
1
@PeanutsMonkey. También funciona con IE si tiene instalada la consola de desarrolladores, creo que está instalada por defecto desde IE8 +. No entendí sobre qué escribiste alert.
gdoron apoya a Monica el
1
@PeanutsMonkey. 1. No puede tener código después de returnhaberlo ignorado. 2. no obtendrá errores ni advertencias. Vea esta DEMO
gdoron apoya a Monica el
9

Todos los argumentos en las funciones de JavaScript son opcionales (lea "escrito libremente").

Las funciones de JavaScript se pueden invocar con cualquier número de argumentos, independientemente del número de argumentos nombrados en la definición de la función. Debido a que una función está escrita de forma flexible, no hay forma de que declare el tipo de argumentos que espera, y es legal pasar valores de cualquier tipo a cualquier función. Cuando se invoca una función con menos argumentos de los declarados, los argumentos adicionales tienen el valor indefinido.

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]
  • JavaScript - La guía definitiva, 5.a edición
j08691
fuente
7

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 argumentsobjeto:

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 nullvalor. Además, "indefinido" en sí mismo no es una palabra clave; ¡Es solo un nombre de variable semi-especial!

Puntiagudo
fuente
¿Podría explicar con más detalle lo que quiere decir con optional"no es realmente un valor" undefined?
PeanutsMonkey
@PeanutsMonkey: si no se proporciona la variable, entonces lo será undefined.
Derek 朕 會 功夫
@Pointy: ¿Qué quiere decir con que no hay garantía de que alguno de los parámetros declarados esté realmente vinculado a un valor?
PeanutsMonkey
1
@PeanutsMonkey JavaScript es un lenguaje dinámico . Al llamar a una función, la declaración de la función no es importante, incluido el número de parámetros. Por lo tanto, puede declarar una función con tantos parámetros como desee, pero eso no impone restricciones sobre cuántos parámetros se pasan realmente cuando se llama a su función. (De esa manera, es algo así como C, al menos C en los viejos tiempos). Por lo tanto, si declara un parámetro y se realiza una llamada sin ningún valor de parámetro proporcionado, el parámetro será undefined.
Puntiagudo
3

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]
Cohete Hazmat
fuente
Gracias. En lugar de publicación cruzada, ¿puede ver el ejemplo que le di a David Thomas, ya que todavía recibo el error?undefined
PeanutsMonkey
@PeanutsMonkey: ¿Eh? ¿Cuál es tu problema?
Rocket Hazmat
No es un problema per se. Me refería a la pregunta de seguimiento que le hice a David sobre cómo pasar más parámetros que ha incluido en su respuesta. Lo que no entiendo del todo es a qué te refieres logs. ¿Dónde lo registra?
PeanutsMonkey
1
@PeanutsMonkey: Lo registra en su "consola JavaScript". En la mayoría de los navegadores, puede presionar F12o Ctrl+Shift+Jpara acceder a él.
Rocket Hazmat
1
La primera oración está desactualizada a partir de ES2015 ...
Heretic Monkey
2

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.

AlbertVanHalen
fuente
@albert argumentos no es array su matriz como objeto see
Mahi
1

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 un variable is undefined.

David dice reinstalar a Monica
fuente
De acuerdo, mientras no haga referencia al parámetro en la función, ¿no obtendré un error? ¿Está bien?
PeanutsMonkey
Ahora, si profundizo en el ejemplo que proporciona, es decir, 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 de undefinedaunque estoy pasando un parámetro?
PeanutsMonkey
1
Porque no vas a devolver nada. Tienes que explícitamente, en su ejemplo, devolver un valor: ya sea return calc; o return a+b;(como la última línea, obviamente, y este último returnen lugar del var calc).
David dice reinstalar a Monica el
¿Quiere decir que no tengo que declarar una variable si lo hago return a+b;?
PeanutsMonkey
@PeanutsMonkey: puede leer más return aquí .
Derek 朕 會 功夫
0

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 argumentsobjeto. Esto le permite crear fácilmente matrices de argumentos de longitud variable.

Kendall Frey
fuente
0

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);
    }
Goyal Vicky
fuente