函数是指由 事件驱动 或 当它被调用时 执行的可重复使用 的代码块。
函数定义的方式有两种:
函数由关键字function定义,第一种定义方式:函数声明形式
function abs (x) {
if (x > 0) {
return x;
} else {
return;
}
}
函数体在执行时,一旦执行到return时,函数执行结束并返回结果,且return后面的代码不执行;如果没有return,函数也会返回结果,但此时返回的值是undefined。
由于javascript函数也是一个对象,abs()就是一个函数对象,我们可以将abs()视为指向此函数的一个变量。
因此第二种函数的定义方式为:函数表达式形式
var abs =function (x) {
if (x >0) {
return x;
} else {
return;
}
};
注:当匿名函数赋值给一个变量,后面的要加";",不能省略。
当调用abs()函数时,若没有参数,即:
abs(); //返回NaN
想要避免收到undefined,可以对参数进行检查即:
function abs (x) {
if (typeof x !== undefined) {
throw"Not a number"
} if (x >0) {
return x;
} else {
return;
}
}
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书写复杂的代码来实现。
function foo (a, b) {
var i, rest = []; //定义一个空数组,用来装多余的参数。
if (arguments.length > 2) {
for (i = 2; i
上面的实例可以书写为:
function foo (a, b, ...rest) {
console.log(rest);
}
这样可以输出全部的参数。
rest使用格式:rest必须写在参数的最后面且rest前面必须用"..."标识,如:function abs (a, b, ...rest){}
我们知道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
重载:函数、方法的名称相同,但参数的类型和数量(函数签名)不同的形式称重载。
JavaScript不像其它语言一样有重载,因为JavaScript的参数是包含零个或多个值的数组。
function abs (num1, num2) {
return num1 + num2;
}
funcion abs (num1, num2) {
return num1 * num2;
}
abs(1,2);