继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

对JavaScript中函数对象的理解

fireup
关注TA
已关注
手记 4
粉丝 10
获赞 97

首先,来看一个求两个数的和的函数

function sum(num1,num2){
    return num1 + num2;
};
alert(sum(1,2));        //3

这个函数很简单,但是如果要求三个数的和呢,很容易会想到再加一个参数num3,同时将返回值也加上num3,那么,求四个数的和,五个数的和呢?再用这种方式写肯定是不行的,其实,js中的函数内部有一个对象叫做arguments,它是一个类数组对象,里面保存着这个函数调用时传入的参数:

function sum(){
    alert(arguments.length);
}
sum(1,2);      //2
function testArgs(){
    alert(arguments[0]);
}
testArgs(4,5);    //4

知道了auguments之后,可以把这个函数该写成求任意个数字的和,只需要把这些数字传入函数即可:

function sum(){
    var sum = 0;
    for(var i =0 ; i < arguments.length; i++){
        sum += arguments[i];
    }
    return sum; 
}
alert(sum(1,2,3,4,5,6));    //21
alert(sum(1,2,3));          //6

再来看一个递归求和的例子,也就是通常我们见到的求1~n的和,最初的方法可以采用以下这种方式实现:

function sum(n){
    if(n == 1){
        return 1;
    } else {
        return n+sum(n-1);
    }
}
alert(sum(5));    //15

有些时候由于命名冲突或者其他的一些原因,我们需要将函数重命名,由于采用了递归,所以函数内部代码中的函数名也要修改,问题在于一个是要修改两次,有些时候我们还会一遗忘..arguments对象有一个callee属性,代表arguments对象属于哪一个函数的,比如上面sum函数中arguments.callee就代表sum本身,所以,可以将代码修改成如下:

function sum(n){
    if(n == 1){
        return 1;
    } else {
        return n+arguments.callee(n-1);
    }
}
alert(sum(5));    //15

现在,我们就不用去关心函数内部的代码了,降低了代码的耦合.
js是支持面向对象编程的,只是它没有类这个概念,有一种常用的方式就是通过构造函数+原型的方式来实现:

function Box(name,age){
    this.name = name;
    this.age = age;
}
var box = new Box("xwc",20);
alert(typeof box);    //"object"
alert(box instanceof Box);    //true

首先写一个很普通的函数Box(构造函数),它就相当于别的面向对象语言中的类,然后用new操作符来实例化一个Box,命名为box,现在box就是Box的一个实例,这点用instanceof可以证明(typeof 在检测基本类型的时候拿手,检测某个对象是谁的实例还是用instanceof吧),到这里,我相信很多人关心这一切的背后到底发生了什么,我查阅了一些资料,发现解释是这样的:使用new操作符之后,js引擎会在后台创建一个空对象,然后把自己的作用域赋给构造函数,接着执行函数中的代码,(你也可以理解成这个对象调用了构造函数,所以this指向的是这个对象),最后返回这个对象。
其实,关于函数的东西还有很多,例如函数的apply调用,call调用还有原型,这里一次描述完不太现实,另,由于本人水平有限,欢迎大家评论指错交流。

打开App,阅读手记
8人推荐
发表评论
随时随地看视频慕课网APP