函数定义
通过关键字function来定义一个函数
function abs(x) {
if (x < 0)
return -x;
else
return x;
}
js中函数也是一个对象,也可以按以下方式定义一个函数,将函数名作为一个指向该函数的变量。
var abs = function(x) {
if (x < 0)
return -x;
else
return x;
};
函数的参数 arguments
arguments是一个类似Array的数据集合,在函数内部,指向该调用该函数所传递的所有参数。
JavaScript允许传入任意个参数,传入的参数比定义的参数多也没有问题。为保证所用参数正确,在使用前可以利用arguments来获取所有传递过来的参数,对其进行参数验证。
function abs(x) {
if (typeof x !== 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
ES6标准引入了rest参数,可以方便地获取函数定义以外的参数。
function foo(x, y, ...rest) {
console('x=' + x);
console('y=' + y);
console(rest);
}
foo(1 ,2 ,a ,royal ,100);
//x = 1
//y = 2
//Array [a , royal , 100]
foo(1);
//x = 1
//y = undefined
//Array []
rest参数只能写在最后,前面用...标识,从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest,所以,不再需要arguments我们就获取了全部参数。
如果传入的参数连正常定义的参数都没填满,也不要紧,rest参数会接收一个空数组(注意不是undefined)。
方法
将一个函数绑定到一个对象上,则称此函数为这个对象的方法。
var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};
xiaoming.age(); // 今年调用是25,明年调用就变成26了
要保证this指向正确,必须用obj.xxx()的形式调用!ECMA决定,在strict模式下让函数的this
指向undefined。在非strict模式下,直接调用某个对象的方法它重新指向全局对象window。
apply
要指定函数的this指向哪个对象,可以用函数本身的apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
另一个与apply()类似的方法是call(),唯一区别是:
apply()把参数打包成Array再传入;
call()把参数按顺序传入。
比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5