函数基本介绍
函数对任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方、任何地点调用执行。ECMAScript中函数使用function关键字声明,后跟一组参数以及函数体。函数基本语法如下:
function functionName(arg0,arg1...,argN){
statements
}
以下是一个函数示例:
function sayHi(name,message){
alert("Hello"+name+","+message);
}
调用示例如下:
sayHi("Nicholas","how are you today?");
ECMAScript中的函数在定义时不必指定是否返回值。任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。请看下面的例子:
function sum(num1,num2){
return num1+num2;
}
调用这个函数的示例代码如下:
var result=sum(5,10);
这个函数会在执行return语句之后停止并立即退出。因此,位于return语句之后的任何代码都永远不会执行。例如:
function sum(num1,num2){
return num1+num2;
alert("hello");//永远不会执行
}
严格模式对函数有一些限制:
- 不能把函数命名为eval或arguments;
- 不能把参数命名为eval或arguments;
- 不能出现两个命名参数同名的情况;
理解参数
ECMAScript函数不介意传递进来多少个参数,也不会在乎传进来的参数是什么类型。也就是说,即便你定义的函数只接受两个参数,在调用这个函数时也未必一定要传递两个参数。之所以会这个是因为ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
其实,arguments对象只是与数组类似,因为可以使用方括号语法访问它的每一个元素(第一个元素是arguments[0]),使用length属性来确定传递进来多少个参数。
通过访问arguments对象的length属性可以获知有多少个参数传递给了参数。下面这个函数会在每次被调用时,输出长孺其中的参数个数:
function howManyArgs(){
alert(arguments.length);
}
howManyArgs("string",45);//2
howManyArgs();//0
howManyArgs(12);//1
由此可见,开发人员可利用这点让函数能够接受任意个参数并分别实现适当的功能。请看下面的例子:
function doAdd(){
if(arguments.length==1){
alert(arguments[0]+10);
}else if(arguments.length==2){
alert(arguments[0]+arguments[1]);
}
}
doAdd(10);//20
doAdd(30,20)//50
另一个与参数相关的重要方面就是arguments对象可以与命名参数一起使用,如下所示:
function doAdd(num1,num2){
if(arguments.length==1){
alert(num1+10);
}else if(arguments.length==2){
alert(argument[0]+num2);
}
}
在重写后的这个doAdd()函数中,两个命名参数都与arguments对象一起使用。由于num1的值与arguments[0]的值相同,因此它们可以互换使用。
关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。
关于参数还要记住最后一点:没有传递的命名参数将自动被赋予undefined值。这就和定义定义了变量但又没有初始化一样。
严格模式对如何使用arguments对象做出了一些限制。首先,,赋值会变得无效。也就是说,即使把arguments[1]设置为10,num2的值仍然还是undefined。其次,重写arguments的值会导致语法错误。
没有重载
ECMAScript函数不能像传统意义上那样实现重载。而在其他语言(如java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接收的参数的类型和数量)不同即可。如前所述,ECMAScript函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载时可能做到的。
如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。如下所示:
function addSomeNumber(num){
return num+100;
}
function addSomeNumber(num){
return num+200;
}
var result=addSomeNumber(100);//300
在此,函数addSomeNumber()被定义了两次。第一个版本参数加100,第二个版本给参数加200.由于后定义的函数覆盖了先定义的函数,因此当在最后一行代码中调用这个函数时,返回的结果是300。