javascript篇-----函数
ECMAScript中的函数使用function关键字来声明,后跟一组参数以及函数体。基本语法如下,
1 { 2 function functionName (arg0, arg1,...,argN) { 3 statement 4 } 5 }
函数声明后就必定会调用,声明的函数可以通过其函数名来调用,后面还要加上一堆圆括号和参数(圆括号中的参数如果有多个,可以用都好隔开)。
1 { 2 // 函数声明 3 function sayHi (name, message) { 4 console.log('Hello ' + name + ',' + message); 5 } 6 // 函数调用 7 sayHi('lili', 'good job!'); 8 }
ECMAScript中的函数在定义时不必指定时候返回值,函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。并且,函数会在执行完return语句之后停止并立即退出,位于return语句之后的任何代码都永远不会执行。
1 { 2 function sum (num1, num2) { 3 return num1 + num2; 4 alert();// 永远不会执行 5 } 6 }
return语句也可以不带有任何返回值。在这种情况下,函数在停止执行后将返回undefined值。这种用法一般用在需要提前停止函数函数执行而不需要返回值的情况下。
理解参数
ECMAScript的函数不介意传递进来多少个函数,也不在乎传进来参数是什么数据类型。即便你定义的函数只接受两个参数,在调用函数时也未必一定要传递两个。可以传递一个、三个甚至不传递参数,而解析器永远都不会有任何怨言。之所以会这样,原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接受到的始终就是这个数组,而不关心数组中包含哪些参数。如果这个数组中不包含任何元素,就无所谓。如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
其实,arguments对象只是和数组类似,因此可以使用方括号语法访问它的每一个元素,使用length属性来确定传递进来多少个参数。
另外一个重要的特点就是,命名的参数只提供便利,但不是必需的。另外,在命名参数方面,其他语言可能需要事先创建一个函数签名,而将来的调用必须与该签名一致。但是,ECMAScript就不同,ECMAScript的解析器并不会验证命名参数时候和参数声明的时候是否一致。
1 { 2 function sum () { 3 if(arguments.length !== 0) { 4 var length = arguments.length; 5 var s = 0; 6 for (var i = 0; i < length; i++) { 7 s += arguments[i]; 8 } 9 return s; 10 } 11 return 0; 12 } 13 sum(1, 2);// 3 14 sum();// 0 15 sum(1, 2, 3, 4, 5);// 15 16 }
没有重载
ECMAScript的函数不能像传统意思上那样实现重载,因为ECMAScript的函数没有签名,其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。
由于没有重载的特点,如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
1 { 2 function sum () { 3 console.log(1); 4 } 5 function sum () { 6 console.log(2); 7 } 8 sum();// 2 9 }