函数内部属性:arguments和 this

在函数内部,有两个特殊的对象: arguments和 this。 arguments是一个类数组对象,包含着传入函数中的所有参数, 主要用途是保存函数参数。 但这个对象还有一个名叫 callee的属性,该属性是一个指针,指向拥有这个 arguments对象的函数 。

1 function box(num){
2     if(num <=1 ){
3         return 1;
4     }else{
5         return num*box(num-1); //一个简单的递归
6     }
7 }
8 alert(box(4));

对于阶乘函数一般要用到递归算法, 所以函数内部一定会调用自身; 如果函数名不改变是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改。为了解决这个问题,我们可以使用 arguments.callee来代替 。

    function sum(num){
        if(num <=1){
            return 1;
        }else{
            return num*arguments.callee(num-1);//使用arguments.callee函数,调用自身,实现递归
        }
    }
    alert(box(4));    

函数内部另一个特殊对象是 this,其行为与 JavaC#中的 this大致相似。换句话说,this引用的是函数据以执行操作的对象, 或者说函数调用语句所处的那个作用域。

 PS: 当在全局作用域中调用函数时, this对象引用的就是 window 。

// window是一个对象,而且是JS里面最大的对象,是最外围的对象
    alert(typeof window);//window是对象,类型是object;
    alert(typeof this);//和window是一样的,所以this就是window;
    alert(window);//输出[object Window] 
    alert(this);//输出[object Window] this目前表示的是window,因为在window的范围内
var color="red";//这里color就是全局变量,而这个变量又是window的属性
    alert(window.color);//这里已经很好说明color是window下的属性
    alert(this.color);//同上
    alert(color);//同上
var box={
        color:'green',
        sayColor:function(){
            return this.color; //等价于box.color
        }
    }
    alert(box.sayColor());//局部打印box对象的颜色
window.color="红色的";
    function sayColor(){
        alert(this.color);//所以这里执行是动态的,第一次是在window下的,第二次是在box下的
    }
    sayColor();//输出为'红色的';其实范围是在window下的
    var box={
        color:"绿色的" //创建一个对象
    }
    box.sayColor=sayColor;//追加一个对象属性,并把sayColor函数赋给对象box.sayColor;
    box.sayColor();//输出为'绿色的',此时是在box的范围下的

 



 



 




 

posted @ 2017-05-13 15:53  代码小精灵  阅读(339)  评论(0编辑  收藏  举报