在函数内部,有两个特殊的对象: 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,其行为与 Java和 C#中的 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的范围下的
时间: 2024-10-07 09:17:42