如果我不在Javascript函数中传递参数会发生什么?

我对JavaScript的世界是陌生的,并且正在着手编写非常基本的函数,并偶然发现了下面的例子,并且我不确定为什么它在函数需要的时候没有传递参数。

示例函数

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

现在,如果我调用函数myfunction(); 我收到警报。 为什么我可以在没有任何错误或警告的情况下调用函数,而没有传递参数呢?

编辑

我没有想到会有这么多好的答案,我也没有办法说出哪个答案是最好的,所以我可以要求人们提出最好的答案,我会把答案给予那个人。

什么都不会发生 – 这意味着你不会得到一个错误或警告,因为在JavaScript中传递参数是可选的。
所有不是“提供”的参数将有undefined值 。

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

现在在foo函数里面:

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

你甚至可以传递更多的参数,比如:

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

您可以从函数内部知道arguments.length提供的arguments.length的数量。

现场演示


代码来自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);​ 

处理任意数量参数的有用函数的示例:

 function max() { var maxValue = arguments[0]; for (var i = 1; i < arguments.length; i++) { if (maxValue < arguments[i]) { maxValue = arguments[i]; } } return maxValue; } 

现场演示

JavaScript函数中的所有参数都是可选的(读“松散types”)。

无论函数定义中指定的参数个数如何,都可以使用任意数量的参数调用JavaScript函数。 因为函数是松散types的,所以它没有办法声明它所期望的参数types,并且将任何types的值传递给任何函数是合法的。 当使用比声明的参数更less的参数调用函数时,附加参数具有未定义的值。

您可以通过使用命名的参数variables或参数对象来引用函数内的函数参数。 该对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。例如,如果函数传递了三个参数,则可以参考参数,如下所示:

 arguments[0] arguments[1] arguments[2] 
  • JavaScript – 权威指南,第5版

这就是JavaScript的工作原理。 参数是可选的,如果函数调用中缺less参数,则函数中的值不是真正的值“未定义”。

“可选的”我的意思是:调用任何函数涉及任意长的参数列表。 传递给一个函数的参数数量和声明的数量之间不需要关系。 最好的方式来思考这个声明,然后:

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

是你声明了一个函数,把名字“a”绑定到第一个参数,把“b”绑定到第二个参数,把“c”绑定到第三个参数。 然而,这并不能保证任何这些实际上在任何给定的函数调用中将被绑定到一个值。

同理,你可以定义一个没有任何参数的函数,然后通过arguments对象“查找”它们:

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

所以这与第一个function不太一样,但是在大多数情况下,这个function在实际上非常接近。

JavaScript中的“未定义”值是一个值,但它的语义在语言上是非常不寻常的。 特别是它不完全相同的null值。 另外,“未定义”本身不是关键字; 这只是一个半特殊的variables名称!

JavaScript没有像其他语言那样的函数参数的默认值。 所以,你可以通过尽可能多的或尽可能less的论点,只要你想。

如果你没有传递一个值,这个参数是undefined

 function myfunction(x) { alert(x); } myfunction(); // alerts undefined myfunction(1); // alerts 1 myfunction(1,2,3); // alerts 1 

如果您传递的参数多于签名中的参数,则可以使用arguments

 function myfunction(x) { alert(x); console.log(arguments); } myfunction(1,2,3); // alerts 1, logs [1,2,3] 

因为在函数期望能够处理你应该传递的参数之前没有错误。

例如:

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

会抛出一个错误; 尽pipe可能只有一个NaN (在这种情况下)或一个variable is undefined

您也可以提供更多的参数,而不仅仅是函数中提到的参数

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

您可以使用arguments属性这是一个数组,以查看提供的参数。

如果你省略了这个参数,它的值将是undefined 。 这使您可以很容易地创build可选参数。

另一个特性是可以定义一个没有参数的函数,并且使用arguments对象成功地调用它。 这使您可以轻松创build可变长度的参数数组。