函数
函数的定义
函数是指由 事件驱动 或 当它被调用时 执行的可重复使用 的代码块。
函数定义的方式有两种:
函数由关键字function定义,第一种定义方式:函数声明形式
function abs (x) {
if (x > 0) {
return x;
} else {
return;
}
}
其中,abs为函数名,x为参数,多个参数用逗号","隔开, 花括号里的是函数体,函数体可以是语句块,也可以是空语句。
函数体在执行时,一旦执行到return时,函数执行结束并返回结果,且return后面的代码不执行;如果没有return,函数也会返回结果,但此时返回的值是undefined。
由于javascript函数也是一个对象,abs()就是一个函数对象,我们可以将abs()视为指向此函数的一个变量。
因此第二种函数的定义方式为:函数表达式形式
var abs =function (x) {
if (x >0) {
return x;
} else {
return;
}
};
这种情况下,function (x) {......}是一个匿名函数,它没有函数名,但它赋值给了变量abs,因此可以通过变量abs调用该函数。
注:当匿名函数赋值给一个变量,后面的要加";",不能省略。
当调用abs()函数时,若没有参数,即:
abs(); //返回NaN
此时,参数为undefined,返回的结果为NaN。
想要避免收到undefined,可以对参数进行检查即:
function abs (x) {
if (typeof x !== undefined) {
throw"Not a number"
} if (x >0) {
return x;
} else {
return;
}
}
argument
JavaScript函数自带一个关键字argument,它指向当前函数的调用者传入的所有参数,类似一个数值Array,但又不是一个Array。使用argument可以访问传入函数的所有参数,arguments[0]表示访问传入函数的第一个参数,arguments.length得到传入参数的个数。
JavaScript可以接收任意多个参数。
如:
function abs (x) {
if (typeof x !== undefined) {
throw"Not a number"
} if (x >0) {
return x;
} else {
return;
}
}
调用:
abs(10, 1, 20, 0); //返回10 1 20 0
argument[0]得到的结果是10,argument[1]得到的结果是1,argument[3]得到的结果是0。使用argument.length得到参数的个数为4。
rest
当我们调用函数时,实参的个数大于形参的个数时,想要获取全部的实参,不得不使用argument书写复杂的代码来实现。
function foo (a, b) {
var i, rest = []; //定义一个空数组,用来装多余的参数。
if (arguments.length > 2) {
for (i = 2; i<arguments.length; i++) {
rest.push(arguments[i]);
}
}
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
由于定义函数时, 规定的形参个数为2,所以想要得到多余的实参,应规定当传入的实参的个数大于2时,使用argument.length获得传入的实参数量,rest.push(argument[i])获得多余的参数,这样书写很复杂,ES6标准引入了rest关键字,用来获取传入的全部参数。
上面的实例可以书写为:
function foo (a, b, ...rest) {
console.log(rest);
}
这样可以输出全部的参数。
rest使用格式:rest必须写在参数的最后面且rest前面必须用"..."标识,如:function abs (a, b, ...rest){}
小心return语句
我们知道javascript引擎有个自动在行末尾添加分号的机制,这样很可能会掉进return的陷阱。如:
function abs (x) {
return {name : "x"};
}
但如果不小心这样书写了:
function abs(x) {
return
{name : "x"};
}
由于javascript的机制,上述代码其实写成了:
function abs (x) {
return; //自动在行末尾添加分号,想当于 return undefined。
{name : "x"};//此时这个段代码不会执行。
}
由于return后面会自动添加";",执行到return时,函数执行结束,后面的代码{name : "x"}不会执行,相当于返回了undefined值。所以正确的多行书写格式为:
function abs (x) {
return {
name : "x"
};
}
没有传递值的形参将自动赋值undefined,就跟定义了变量没有初始化相似。
function abs (num1, num2) {
return num1 + num2;
}
abs(1); //返回NaN
以上将1传递给了参数num1,而没有传递值给num2,所以将自动赋值undefined给num2,因此返回结果是"1 + undefined"的值,即:NaN。
重载
重载:函数、方法的名称相同,但参数的类型和数量(函数签名)不同的形式称重载。
JavaScript不像其它语言一样有重载,因为JavaScript的参数是包含零个或多个值的数组。
function abs (num1, num2) {
return num1 + num2;
}
funcion abs (num1, num2) {
return num1 * num2;
}
abs(1,2);
以上定义了两个相同的函数,则该名字属于后定义的函数,后定义的函数会覆盖先定义的函数,所以调用了abs()函数后的结果返回2。