函数内部的属性: arguments 和this是函数内部的两个特殊对象 arguments: function recursion(num){ if(num<=1){ return 1; }else{ return num*recursion(num-1); } } 另外一种写法: function recursion(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } arguments:表示当前参数的数组 arguments.callee 表示引用当前正在正在执行的函数,或者说是调用arguments.callee的函数 的引用,arguments.callee给匿名函数提供了一种自我引用的方式 var func=function(){ alert(func===arguments.callee); } func();//调用该函数,咱们得出的结果是true 从该例子咱们能够看出func和arguments.callee对象的类型和值都相等。 callee属性的初始值就是正在执行的Function对象 caller: 返回一个对函数的引用,该函数调用了当前函数 this 对象: this对象引用的是window(windwo是一个对象,并且是js当中最大的一个对象 ,而且它是最外围的对象) alert(window);//[object window] alert(typeof window);//object window 是对象 类型是对象 表示全局 alert(this); // [object Window] this 目前表示的是window,由于在window的范围下 alert(typeof this);//object alert(this===window);//返回值为 true 在“全局”变量下的this 就是window window.color='红色的'; function sayColor(){ //alert(this);// [object window] alert(this.color);//由于该函数 sayColor() 未赋值给一个对象 因此此处的this依然表明着window对象 } sayColor();// 调用的是window下的color var box={ color:'蓝色的' }; box.sayColor=sayColor;将sayColor函数赋值给了 box对象的sayColor属性 /* 上边的代码其实就至关于 var box={ color:'蓝色的', sayColor:function(){ //alert(this);// [object Object] alert(this.color); } }; */ box.sayColor();//此处执行的是box里边的this.color //结果是 蓝色的 -------------------------------------------- <script type="text/javascript"> function box(num1,num2){ return num1+num2; } //能够使用这种方式将sum函数转换成 box方法 function sum(num1,num2){ return box.apply(this,[num1,num2]);//此处的this指的是window对象(将this换成window也是同样的),数组表示的是传递的参数 } alert(sum(19,21));//返回的结果是40 ->函数apply: 语法:apply[[thisObj],[argArray]] 定义:应用某一个对象的一个方法,用一个对象替换当前对象 thisObj表明某一个对象 上述例子中这个对象是当前对象 this argArray表示用来替换当前对象的的对象的参数 数组 上述例子的另外一个中写法 function sum2(num1,num2){ return box.apply(this,arguments);//arguments表明的是box函数中参数的数组 } alert(sum2(10,10)); ->使用apply和call能够冒充另外一个方法 apply与call实现的效果是同样的 call和apply不一样的是 call中的参数是一个一个的,而apply则必须以数组的形式传递 function sum(num1,num2){ return box.call(this,num1,num2);//注意参数的传递方式和apply的不一样之处 } alert(sum(10,10)); 冒充的做用:主要用于扩展函数赖以运行的做用域 /* var color='红色'; var box={ color:'蓝色' }; function sayColor(){ alert(this.color); } //使用call 冒充 window对象 sayColor.call(window);//红色 弹出的是window对象的 color sayColor.call(this);// 红色 弹出的样式window对象的color //使用call 冒充 box对象 sayColor.call(box);//蓝色 弹出的是 box对象下的color属性 */ 此时 能够看出 并无给box对象添加 sayColor属性对象却能够执行出 sayColor的效果