2012-06-19 9 views
53

Soy nuevo en el mundo de Javascript y estoy jugando con la escritura de funciones muy básicas y tropecé con el ejemplo siguiente por accidente y no estoy seguro de por qué funciona cuando no estoy pasando un parámetro cuando la función lo exige.¿Qué sucede si no paso un parámetro en una función de Javascript?

función de ejemplo

function myfunction(x) { 
    alert("This is a sample alert"); 
} 

Ahora bien, si me llaman a la función myfunction(); me presenta la alerta. ¿Por qué es que puedo llamar a la función sin ningún error o advertencia cuando no he pasado un parámetro?

EDITAR

no esperaba tantos grandes respuestas y yo soy de ninguna manera en una posición todavía capaz de decir cuál de las respuestas es la mejor manera soy capaz de pedir a la población para sugerir la mejor respuesta y Le otorgaré la aceptación a esa persona.

+2

También podría ser útil: https://developer.mozilla.org/es/JavaScript/Guide/Functions –

+1

No hay sobrecarga en función de las firmas de función en JS, por lo que realmente no importa cuántos params la función "espera ". Incluso puede pasar params que la función no está definida para tomar y simplemente usar los argumentos de la palabra clave para recuperarlos. – scrappedcola

+0

@scrappedcola - ¿Qué quiere decir con sobrecargar y pasar parámetros que la función no está definida para tomar? ¿Puedes dar ejemplos? – PeanutsMonkey

Respuesta

57

No sucederá 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 value.

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

foo(1); 

Dentro de la función foo ahora:

function foo(x, y, z){ 
    x === 1 
    y === undefined 
    z === undefined 
} 

incluso se puede pasar más argumentos, como:

foo(1,2,3,4,5,7); // Valid! 

se puede saber las cantidades de los parámetros suministrados por arguments.length desde el interior de la función .

Live DEMO


el código de la DEMO:

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 la función útil que manejar 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; 
} 

Live DEMO

+0

Gracias por la demostración en vivo. No esperaba tantas buenas respuestas. Entonces, si tengo una función como 'function myfunction (a, b) {}' y paso los valores myfunction (1,2,3,4,5), ¿entiendo que todavía es válida? ¿Existe la expectativa de que habrá alguna advertencia o error? – PeanutsMonkey

+0

Disculpa, ¿te importaría elaborar lo que hace el comando 'console.log' y también arguments.length? – PeanutsMonkey

+0

@PeanutsMonkey. ¡Válido! no hay advertencia, no hay error, incluso es útil, te daré una demostración en un momento. – gdoron

5

Así es como funciona JavaScript. Los parámetros son opcionales y tendrán el valor de no valor real "indefinido" en la función si faltan en una llamada de función.

Por "opcional" quiero decir exactamente eso: invocando cualquier función implica una lista arbitrariamente larga de parámetros. No es necesario que haya ninguna relación entre el número de parámetros pasado a una función y el número declarado. Mejor manera de pensar de esta declaración, entonces:

function x(a, b, c) { 
    // ... 
} 

es que usted está declarando una función de unión y el nombre "a" para el primer parámetro "b" para el segundo, y "c" para la tercero. Sin embargo, no está garantizado que alguno de ellos en realidad esté vinculado a un valor en cualquier invocación dada de la función más tarde.

De la misma manera, se puede definir una función sin ningún parámetro en absoluto, y luego "encontrar" a través de la arguments objeto:

function noArgs() { 
    var a = arguments[0], b = arguments[1], c = arguments[2]; 
    // ... 
} 

Así que no es bastante la misma que la primera función , pero está cerca en la mayoría de los sentidos que cuentan prácticamente.

El valor "indefinido" en JavaScript es un valor, pero su semántica es algo inusual a medida que van los idiomas. En particular, no es exactamente lo mismo que el valor null. Además, "indefinido" en sí mismo no es una palabra clave; es solo un nombre de variable semi-especial!

+0

¿Podría elaborar más lo que quiere decir con 'opcional' así como también '' no realmente un valor '' indefinido ''? – PeanutsMonkey

+0

@PeanutsMonkey - Si la variable no está dada, entonces será 'undefined'. –

+0

@Pointy - ¿Qué quiere decir con que no hay garantía de que alguno de los parámetros declarados se vincule a un valor? – PeanutsMonkey

7

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

funciones de JavaScript pueden ser invocadas con cualquier número de argumentos, sin importar el número de argumentos con nombre en el definición de la función. Debido a que una función está tipeada libremente, 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 que se declaran, los argumentos adicionales tienen el valor indefinido.

Puede consultar los argumentos de una función dentro de la función usando las variables de argumento nombradas o el objeto arguments. Este objeto contiene una entrada para cada argumento pasado a la función, el índice de la primera entrada a partir de 0. Por ejemplo, si una función se pasa tres argumentos, se puede hacer referencia a la discusión de la siguiente manera:

arguments[0] 
arguments[1] 
arguments[2] 
  • JavaScript - La guía definitiva, 5ª edición
1

Porque no hay ningún error hasta que la función espere poder trabajar con el parámetro que se supone que debe pasar.

Por ejemplo:

function myfunction(x) { 
    return x*2; 
} 

arrojaría un error; aunque probablemente solo sea NaN (en este caso) o variable is undefined.

+0

Bien, siempre que no haga referencia al parámetro en la función, ¿no obtendré un error? ¿Está bien? – PeanutsMonkey

+0

Así es como parece funcionar, sí. –

+0

Ahora, si me refiero al ejemplo que proporciona, es decir 'function myfunction (a, b) {var calc = a + b; return;} 'y luego invocar la función' document.write (myfunction (1.2)); '¿por qué sigo obteniendo el valor de' undefined' aunque estoy pasando un parámetro? – PeanutsMonkey

2

JavaScript no tiene valores predeterminados para los parámetros de función como lo hacen otros lenguajes. Por lo tanto, puede pasar tantas o tan pocas discusiones 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 que se encuentran en la firma, puede utilizar arguments.

function myfunction(x) { 
    alert(x); 
    console.log(arguments); 
} 

myfunction(1,2,3); // alerts 1, logs [1,2,3] 
+0

Gracias. En lugar de publicar publicaciones cruzadas, ¿pueden ver mi ejemplo que proporcioné a David Thomas porque todavía me aparece el error 'undefined' – PeanutsMonkey

+0

@PeanutsMonkey: ¿eh? ¿Cuál es tu problema? –

+0

No es un problema per se. Me estaba refiriendo a mi pregunta de seguimiento a David sobre la aprobación de más parámetros que ha incluido en su respuesta. Lo que no sigo es ¿a qué se refiere con 'registros'? ¿Dónde lo registra? – PeanutsMonkey

1

También puede proporcionar más argumentos que sólo el mencionado en la función

myFunction(1,2,3,4,5,6,7,'etc'); 

Puede utilizar la propiedad arguments que es una matriz con el fin de ver los argumentos proporcionados.

+1

+1 por mencionar 'argumentos'. –

+0

@albert arguments is not array su array como objeto [see] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) – Mahi

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

Cuestiones relacionadas