It has been 1485 days since the last update, the content of the article may be outdated.

定义函数

方法1

javascript
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
  • function指出这是一个函数定义;
  • abs是函数的名称;
  • (x)括号内列出函数的参数,多个参数以,分隔;
  • { ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句。

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

  • 如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined

方法2

javascript
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};

和第一种形式等价,末尾要加 ;
在这种方式下,function (x) { ... }是一个匿名函数,它没有函数名。
但是,这个匿名函数赋值给了变量abs,所以,通过变量abs就可以调用该函数。


调用函数

javascript
abs(9)//9
abs(-10)//10

传入多余的参数也不会报错

javascript
abs(9,'hjh')//9
abs()//NaN

对于缺少参数,此时abs(x)函数的参数x将收到undefined,计算结果为NaN

arguments

在函数内部获取参数列表,即使存在多余参数。

javascript
function foo(x) {
alert('x = ' + x); // 10
for (var i=0; i<arguments.length; i++) {
alert('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);

结果是:

plaintext
x = 10
arg 0 = 10
arg 1 = 20
arg 2 = 30

利用arguments,你可以获得调用者传入的所有参数。
也就是说,即使函数不定义任何参数,还是可以拿到参数的值:

javascript
function abs() {
if (arguments.length === 0) {
return 0;
}
var x = arguments[0];
return x >= 0 ? x : -x;
}

abs(); // 0
abs(10); // 10
abs(-9); // 9

rest

ES6标准引入了rest参数,获取除了已定义参数之外的参数

javascript
function foo(a, b, ...rest) {
alert('a = ' + a);
alert('b = ' + b);
alert(rest);
}

foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]

foo(1);
// 结果:
// a = 1
// b = undefined
// Array []

rest参数只能写在最后,前面用…标识,从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest,
所以,不再需要arguments我们就获取了全部参数。
如果传入的参数连正常定义的参数都没填满,也不要紧,rest参数会接收一个空数组(注意不是undefined)。

tips

一个return语句的坑需要注意 ,JavaScript在编译时会自动加上;

javascript
function foo() {
return // 自动添加了分号,相当于return undefined;
{ name: 'foo' }; // 这行语句已经没法执行到了
}

正确写法:

javascript
function foo() {
return { // 这里不会自动加分号,因为{表示语句尚未结束
name: 'foo'
};
}

exercise

1.求任意长度数组的和

javascript
function sum(...rest) {
var sum=0;
for(var i in rest){
sum=sum+rest[i];
}

return sum;
}

2.定义一个计算圆面积的函数area_of_circle(),它有两个参数:

  • r: 表示圆的半径;
  • pi: 表示π的值,如果不传,则默认3.14
javascript
function area_of_circle(r, pi) {
if (arguments.length===2) {
return pi*r*r;
}else if(arguments.length===1){
pi=3.14;
return pi*r*r;
}else{
return undefined;
}
}