函数的基本语法如下所示:
function functionName(arg0, arg1,...,argN) {
statements
}
ECMAScript中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。函数会在执行完return语句之后停止并立即退出,位于return语句之后的任何代码都永远不会执行。
理解参数
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接受两个参数,在调用这个函数式也未必一定要传递两个参数,可以传递一个、三个甚至不传递参数。之所以会这样,是因为ECMAScript中的参数在内部是用一个数组来表示的。函数接受的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
其实,arguments对象只是与数组类似(它并不是array的实例),因为可以使用方括号语法访问它的每一个元素,使用length属性来确定传递进来多少个参数。
ECMAScript函数有一个重要的特点:命名的参数只提供便利,但不是必需的。通过访问arguments对象的length属性可以获知有多少个参数传递给了函数,开发人员可以利用这一点让函数能够接收任意个参数并分别实现适当的功能,可以基本实现重载功能。
关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。不过,这并不是说读取arguments和参数这两个值会访问相同的内存空间;它们的内存空间是独立的,但他们的值会同步。另外要记住,arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。
关于参数还要记住最后一点:没有传递值的命名参数将自动赋予undefined值。
严格模式对如何使用arguments对象做出了一些限制,重写arguments的值会导致语法错误(代码将不会执行)。
** 注意:ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。 **
没有重载
ECMAScript函数不能像传统意义上那样实现重载。如前所述,ECMAScript函数没有签名,因为其参数是由包含零或多个值得数组来表示的。而没有函数签名,真正的重载是不可能做到的。
如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。