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 World");//永远不会执行 }一个函数也可以包含多个return语句。
function diff(num1, num2){ if(num1 < num2){ return num2 - num1; }else{ return num1 - num2; } }return语句也可以不带有任何返回值,在这种情况下,函数在停止执行后将返回undefined值,这种用法一般用在需要提前停止函数执行而不需要返回值的情况下。
function sayHi(name, message){ return; alert("Hello" + name + "," + message);//永远不会调用 }严格模式对函数的一些限制:
1.不能把函数命名为eval或arguments
2.不能把参数命名为eval或arguments
3.不能出现两个命名参数同名的情况
在函数体内可以通过argument对象来访问参数数组,从而获取传递给函数的每一个参数。
其实,arguments对象只是与数组类似,因为可以使用方括号语法访问他的每一个元素(arguments[0],arguments[1]),使用length属性来确定传递了多少参数。
function howManyArgs(){ //可以没有参数,命名的参数只提供便利,但不是必需的 alert(arguments.length); } howManyArgs("string",45);//2 howManyArgs();//0 howManyArgs(12);//1可以利用这一点让函数能够接收任意个参数并分别实现适当的功能,这个特性不算是完美的重载,但是也算是弥补了ECMAScript的缺憾。
function doAdd(){ if(arguments.length == 1){ alert(arguments[0] + 10); }else if(arguments.length == 2){ alert(arguments[0] + arguments[1]); } } toAdd(10);//20 toAdd(30 , 20);//50arguments对象可以和命名参数一起使用
function doAdd(num1, num2){ if(arguments.length == 1){ alert(num1 + 10);//argument[0]的值与num1的值相等 }else if(arguments.length == 2){ alert(arguments[0] + num2); } }arguments的值永远与对应参数的值保持同步
function toAdd(num1,num2){ arguments[1] = 10; //修改了argument[1]的值也就修改了num2,结果他们的值都变成了10 alert(arguments[0] + num2); } 修改了arguments[1]的值也就修改了num2,但是这并不是说取读这两个值会访问相同的内存空间,他们的内存空间是独立的,但是值是同步的。另外还要记住:如果只传入一个参数,那么为arguments[1]设置的值不会反映到命名参数中,这是因为arguments对象的长度是由传入的参数个数决定的,而不是由定义函数时的命名参数决定的。关于参数还要记住最后一点:没有传递值的命名参数将自动被赋予undefined值。在严格模式下arguments有很多限制。ECMAScript函数没有重载
function add(num){ return num + 10; } function add(num){ return num + 20; } var result = add(10);//30函数add被定义了两次,后定义的覆盖了先定义的函数,通过检查传入函数中的参数的类型和数量并做出不同的反应,可以模仿方法的重载。