函数

2017-01-11  本文已影响0人  YangGui

参考教程,廖雪峰

函数定义

通过关键字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
上一篇 下一篇

猜你喜欢

热点阅读